使用Mockito的最佳做法

时间:2018-05-14 13:45:55

标签: java mockito

我对在不同测试类上使用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");
 }
}

或者有更清洁,更好的方法吗?

提前致谢!

2 个答案:

答案 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");
}