4

我有一个方法 - getSomethingAmount() 在我想测试的某个类(A 类)中。这个 getSomethingAmount() 方法逻辑依赖于 Set bSet,它在 A 类初始化时传入构造函数。例如,如果 Set bSet 包含 2 个具有 Status.OK 的对象,则 getSomethingAmount() 必须返回 2。如何使用 Mockito 正确验证此条件?

现在我存根 2 B 类类型对象,将它们放入 bSet 中,然后使用 JUnit 断言断言 getSomethingAmount() 方法结果 - 它可以工作,但在我看来它不像“真正的”Mockito 方式。

4

2 回答 2

1

从您对预期行为的描述来看,这听起来像是对方法进行单元测试的一种非常可靠的方式。通过“真正的 Mockito 方式”,我想你想要的是:

Set mockBSet = mock(Set.class);
stub(mockBSet.size()).toReturn(2);
A testObjectA = new A(mockBSet);
Assert.assertEquals(testObjectA.getSomethingAmount(), 2);

这是在假设 Set 和 test 对象的初始化没有任何副作用的情况下,您希望测试将其考虑在内。(例如,总是添加一些默认的“东西”。)在这种情况下,您也可以省略存根并断言被测方法返回的值等于集合的大小。

于 2011-06-27T08:35:31.123 回答
1

模拟集合中的对象,而不是集合。否则,如果您更改实现,测试将变得脆弱并中断。例如,如果您决定需要遍历 Set 中的对象,而不仅仅是使用 size-method。

B b = mock(B.class);
A target = new A(new HashSet<B>(Arrays.asList(b, b)));
Assert.assertSame(2, target.getSomethingAmount());
于 2011-09-16T22:04:46.503 回答