在我的实现类中,我有一个读写锁定义,如下所示,
@Inject
@Named("CustomizedLock")
private ReentrantReadWriteLock rwLock;我在一个名为run()的方法中使用它,
rwLock.writeLock().lock();锁定过程。但是当我试图用mockito测试时,我发现ReentrantReadWriteLock是初始化的。但是当我试图得到rwLock.writeLock()时,它是空的。这是我的测试。
@Mock
private ReentrantReadWriteLock feedReadWriteLock;
@InjectMocks
private CustomModule module = mock(CustomModule.class);
/////////////////////////
@Test
public void test() {
when(module.getReadWriteLock()).thenReturn(mock(ReentrantReadWriteLock.class));
PowerMockito.doReturn(new ReentrantReadWriteLock()).when(module.getReadWriteLock());
cacheJob.run();
}正如我所说,rwLock.writeLock()为null,但rwLock是初始化的。请解释一下莫奇托是怎么发生的。最理想的方法是什么?
发布于 2018-02-21 12:35:55
你嘲笑错了:
@Mock
private ReentrantReadWriteLock feedReadWriteLock;上面的内容创建了一个模拟,然后在测试的中以某种方式进入您的类。
但这一点:
@InjectMocks
private CustomModule module = mock(CustomModule.class);是假的。InjectMocks注释的存在是为了为您完成“将其放入”部分。
换句话说,你应该做的事情如下:
@Mock
private ReentrantReadWriteLock feedReadWriteLock;
@InjectMocks
private CustomModule module = new CustomModule();例如。换句话说:您做的是,而不是,它模拟被测试类的实例。您创建一个“真实”实例,然后必须将所需的模拟对象“插入”到该实际实例中。完全没有必要嘲笑被测试的类。因为您希望测试您的代码,而不是模拟框架为您所模仿的东西。
InjectMocks注释试图为您做到这一点(使用反射和各种黑魔法)。不幸的是,当它不能完成它的工作时,它只是默默地失败了。
从这个意义上说,答案是:不要只是盲目地使用东西。您必须完全理解,,理解您编写的每一行代码。因此:阅读this来理解这些注释之间的区别。
为了记录在案:请注意,您还必须使用Mockito JUnitRunner或手动调用Mockito.initMocks(),这样才能让注释发挥它们的魔力。
发布于 2018-02-21 12:43:06
如果您想模拟测试中的类,则应该使用@Spy。
@RunWith(MockitoJUnitRunner.class)
public class CustomModuleTest {
@Mock
private ReentrantReadWriteLock feedReadWriteLock;
@Spy
@InjectMocks
private CustomModule module;
@Test
public void test() {
doReturn(feedReadWriteLock).when(module).getReadWriteLock();
cacheJob.run();
}
}请注意,间谍的语法与模拟稍有不同。间谍允许您实例化真实的对象,但是可以根据您的意愿模拟一些方法。
在这里,我返回feedReadWriteLock,这是与@Mock一起注意到的,这样,您就可以改变它的行为。您不想像在示例中那样返回一个新实例。
https://stackoverflow.com/questions/48898398
复制相似问题