我是单元测试的新手,我不知道如何处理这个案例,所以我很感激您的意见。
相关代码:
public class Repository {
@Override
public void getUnifiedFoo(@NonNull final Foo foo1,
@NonNull final GetUnifiedFooCallback getUnifiedFooCallback) {
fooDataSource.getFoo2(foo1,new GetFoo2Callback() {
@Override
public void onGetFooSuccess(Foo foo2) {
UnifiedFoo unifiedFoo= createUnifiedFoo(foo1, foo2);
getUnifiedFooCallback.onGetSuccess(unifiedFoo);
}
@Override
public void onGetMedicationCallbackFailure(Throwable t) {
getUnifiedFooCallback.onGetFailure(t);
}
});
}
}
private createUnifiedFoo(Foo foo1, Foo foo2){
return new UnifiedFoo(
foo1.getMember1,
foo1.getMember2,
foo2.getMember3,
foo2.getMember4,
);
}
我的问题是:
- “createUnifiedFoo(Foo foo1, Foo foo2)”应该是包私有(private)的并单独测试吗?
- 在这种情况下,如果是的话,测试调用 1 个方法(在本例中为 fooDataSource.getFoo(...))是否有任何意义?
- 如果在匿名类中回调时可以测试“createUnifiedFoo...”,那么如何捕获回调,以便在调用“onGetFooSuccess(Foo foo2)”时,获取 foo1 stub 、foo2 stub 并断言它们的字段相等以验证它们是否包含正确的值?
谢谢。
最佳答案
这实际上是一个意见问题。
就我个人而言,我会将 createUnifiedFoo
移至不同的类
class FooUnifier {
public UnifiedFoo of(Foo1 f1, Foo2 f2) {...
}
所以在你的存储库中
class Repository {
FooUnifier unifier = new FooUnifier(); // or @Autowired
...
getUnifiedFooCallback.onGetSuccess(unifier.of(foo1, foo2));
}
在单元测试中
@RunWith(MockitoJUnitRunner.class)
class Test {
@InjectMocks
Repository sut;
@Mock
FooDatasource datasource;
@Mock
FooUnifier unifier;
@Mock
UnifiedFoo unifiedFoo;
@Mock
GetUnifiedFooCallback callback;
@Before
public void mockUnifiedFoo()
when(unifier.of(any(), any())).thenReturn(unifiedFoo);
}
}
这将创建模拟并将它们设置为存储库
的成员,允许您创建这样的测试用例
@Test
public void unificationSuccess() {
Foo1 foo1 = mock(Foo1.class);
Foo2 foo2 = mock(Foo2.class);
when(datasource.getFoo2(foo1, eq(callback)))
.then(i -> {
callback.onGetSuccess(unifiedFoo);
});
sut.getUnifiedFoo(foo1, callback);
// make sure the unified foo was created
verify(unifier).of(foo1, foo2);
// make sure the callback was called
verify(callback).onGetSuccess(unifiedFoo);
}
所以基本上,您设置了测试用例,然后验证是否使用正确的参数进行了所有正确的调用。
您可以单独测试 FooUnifier
的正确行为。
关于java - 单元测试验证从匿名类中的回调返回的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48765117/