我对在不同测试类上使用Mock实例化的最佳实践有疑问。
让我们假设我有一个名为PropertiesLoader
的类的模拟 @Mock
private PropertiesLoader propertiesLoader;
我想在两个不同的Test类中调用这个名为getkey()的类的函数。 (TestCrypter)和(TestUserService)
我应该在两个类上实现以下方法吗?
public class TestCrypter{
@Mock
private PropertiesLoader propertiesLoader
@Test
public void firstTest(){
Mockito.when(propertiesLoader.getKey()).thenReturn("123");
}
}
public class TestUserService{
@Mock
private PropertiesLoader propertiesLoader
@Test
public void firstTest(){
Mockito.when(propertiesLoader.getKey()).thenReturn("123");
}
}
或者有更清洁,更好的方法吗?
提前致谢!
答案 0 :(得分:1)
对我来说,如果我们谈论测试,重复的代码就没问题了。
主要目标是保持测试类的表达性和易读性,因此有时最好在测试类中保留一些冗余代码,而不需要制作一些花哨的抽象和实用程序。
在你的情况下,"当"定义了一些特定于测试的行为,因此它应该存储在同一个地方(因为测试结果可能依赖于此),因为外部测试将难以阅读和维护。
但是,如果使用PropertiesLoader会非常常见,可以考虑创建一个覆盖这些调用的抽象类(或其他东西),但要使其参数化(以保持测试逻辑分离)。
答案 1 :(得分:1)
考虑使用
@Before
设置适用于多个(和/或所有)测试的模拟的方法。
在你的例子中,
我会考虑使用以下内容:
@Before
public void preTestSetup()
{
// init the mocks.
// Not required if you are using the MockitoJunitRunner.
MockitoAnnotations.initMocks(this);
// I prefer doReturn.when over when.thenReturn.
Mockito.doReturn("123").when(propertiesLoader).getKey();
// if you'd like, use this instead of the doReturn above:
Mockito.when(propertiesLoader.getKey()).thenReturn("123");
}