java - 单元测试验证从匿名类中的回调返回的对象

标签 java unit-testing callback mocking anonymous-class

我是单元测试的新手,我不知道如何处理这个案例,所以我很感激您的意见。

相关代码:

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,
      );
}

我的问题是:

  1. “createUnifiedFoo(Foo foo1, Foo foo2)”应该是包私有(private)的并单独测试吗?
  2. 在这种情况下,如果是的话,测试调用 1 个方法(在本例中为 fooDataSource.getFoo(...))是否有任何意义?
  3. 如果在匿名类中回调时可以测试“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/

相关文章:

javascript - 在 for 循环之后执行 javascript

java - MVEL 或 Drools 是否无法解析其类型为 Map<String,List<Object>> 的事实?

用于关闭窗口的 Java Swing 非 Activity 按钮

php - 在单元测试中模拟被测试的对象是不是很糟糕?

javascript - 从 JavaScript 调用 Qt 槽

c++ - 回调的缺陷

java - 编写正则表达式来查找连续字符 'o'

java - 组织.hibernate.MappingException : Unknown entity: in spring orm

python - 我应该如何使用独特的 slug 测试 Django View

javascript - 内存泄漏的单元测试javascript