我正在使用Mockito和JUnit测试一个企业级应用程序。以下是在产品离线存储库类测试中将产品添加到离线存储库类别的方法代码:
@Mock
private InitialData initialData;
@InjectMocks
private ProductRepositoryOffline pro;
@Test
public void testPersistProduct() {
Product product = new Product(0, "", "", "", 0.0, true, "", 0, /*Product type*/null, "", 0, 0);
ArrayList<Product> productList = new ArrayList<Product>();
//productList.add(product);
Mockito.when(initialData.getProducts()).thenReturn(productList);
pro.persistProduct(product);
assertEquals(pro.getProducts().get(0), product);
}
这依赖于类中的以下方法:
它在ProductRepositoryOffline
:中测试的方法
@Override
public void persistProduct(Product pr) {
initialData.addProduct(pr);
}
初始数据
private ArrayList<Product> products = new ArrayList<Product>();
public void addProduct(Product product) {
products.add(product);
}
我想问的问题是,在pro.persistProduct(product)
的情况下,除非我已经将产品添加到ArrayList
,否则persistProduct
不意味着在不需要注释的productList.add(product)
的情况下将产品添加至arrayList吗?
以下是您应该做的事情:
@Mock
private InitialData initialData;
@InjectMocks
private ProductRepositoryOffline pro;
@Test
public void testPersistProduct() {
Product product = new Product(0, "", "", "", 0.0, true, "", 0,
/*Product type*/null, "", 0, 0);
ArrayList<Product> productList = new ArrayList<Product>();
productList.add(product);
Mockito.when(initialData.getProducts()).thenReturn(productList);
pro.persistProduct(product);
assertEquals(pro.getProducts().get(0), product);
Mockito.verify(initialData).addProduct(product);
}
因为对象initialData
是模拟的,所以当它调用ProductRepositoryOffline
中的方法initialData.addProduct(pr);
时,它什么也不做。您必须手动将其添加到列表中,以便稍后在assertEquals()
中进行检查。不过,为了确认该方法已被调用,您可以使用verify()
方法来检查是否使用您创建的product
对象在模拟对象上调用了addProduct()
一次。你可以在这里看到更多verify()
的例子
还有其他方法可以模拟void方法,比如您对addProduct()
的使用,要查看这些方法的一些示例,请参阅此处的问题
[EDIT]你可以做的另一个变化是使用doAnswer()
,它看起来像这样:
Mockito.doAnswer(productList.add(product)).when(initialData).addProduct(product);
我不是100%,因为我从未使用过它,但我相信在调用initialData.addProduct(product);
时,产品会添加到您的产品列表中。这样你就不需要使用productList.add(product);
了。希望这能有所帮助!
以下是我在Scala中解决类似问题的方法。
我有一个以下原型的方法:
def myMethod(x: Seq[Int]): Seq[MyStruct]
此方法适用于x
中的每个元素一个函数。此函数的结果取决于输入的值。因此,我想在测试中模拟这种方法,这样它就可以用预先制作的映射来代表现实生活。
以下是我在测试课上如何嘲笑我的函数:
when(objMock.myMethod(any())).thenAnswer({
new Answer[Seq[MyStruct]] {
override def answer(invocation: InvocationOnMock): Seq[MyStruct] =
invocation.getArgumentAt[Seq[Int]](0, classOf[Seq[Int]]).map(myPremadeMapping)
}
})
我的预制映射看起来像这样:
val idToAudience = Map(
param1 -> Ans1,
param2 -> Ans2,
param3 -> Ans3,
...
)