Mockito Spy的行为类似于Mock



环境: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() { 
..
}
}

最新更新