环境:Java11, AWS Lambda, Dagger, JUnit5 (5.9.1), Mockito(4.8.1)(尝试了两个Mockito核心&内联)
我有类A, B和C。
C被注入到B, B被注入到A。方法A.ma1()调用B.mb1(), B.mb1调用C.mc1()
我只是想验证一个方法"mc1"如果我调用A.ma1
下面是我的结构:
@ExtendWith(MockitoExtension.class)
class Test {
@InjectMocks
A a;
@Spy
B b;
@Mock
C c;
@Test
public void test() {
a.ma1();
verify(c).mc1(any());
}
}
问题是当a.a ma1()调用b.b mb1()时,b.b mb1()的行为像Mock而不是Spy。在调试期间永远不会执行方法的内容,而是立即返回。我还试图用@ injectmock和@Spy来注释B。它也没有工作,抛出了一个不同类型的异常。
有谁知道为什么B表现得像一个Mock而不是间谍吗?
注释后添加:下面是完整的代码:(简化)在上面的例子中,AService是A, InternalService是B, PanelDao是C。B"selectMappedInternal"永远不要逐行执行,而是在调用时像mock一样立即返回。
@ExtendWith(MockitoExtension.class)
class Test {
@InjectMocks
AService aService ;
@Spy
InternalService internalService ;
@Mock
PanelDao panelDao;
@Test
public void test() {
..
}
}
public class AService {
@Inject
InternalService internalService;
@Inject
public AService() {
}
public void processMessage(AccSqsMessage accSqsMessage) {
..
internalSet = internalService.selectMappedInternal(accSqsMessage.getCode());
..
}
}
public class InternalServiceImpl implements InternalService {
@Inject
PanelDao panelDao;
@Inject
public InternalServiceImpl() {
}
@Override
public Set<Internal> selectMappedInternal(String code) {
..
Optional<Panel> p = panelDao.findPanelByCode(code);
..
}
}
最后能够求解如下。我猜测问题的原因是实现类"InternalServiceImpl"for interface "InternalService"不能正确地注入到单元测试类(尽管它在注入到业务类时工作得很好),所以在调试期间,我无法看到spy对象中方法的执行。
在监视(没有通知)一个显式提供的实现类之后,一切似乎都解决了。
@ExtendWith(MockitoExtension.class)
class Test {
@InjectMocks
AService aService ;
@InjectMocks
InternalService internalService = Mockito.spy(InternalServiceImpl.class);
@Mock
PanelDao panelDao;
@Test
public void test() {
..
}
}