Java Mockito spy在使用Guice';s事务性

Java Mockito spy在使用Guice';s事务性,java,testing,mockito,Java,Testing,Mockito,这个问题类似于,但解决方案不起作用。mockito和Guice有问题 包模拟 导入com.google.inject.persist.Transactional; 导入lombok.NonNull; 导入java.util.ArrayList; 导入java.util.List; 公共类{ 公共INTA(){ ArrayList对象=新的ArrayList(); 返回此.B(对象); } @交易的 public int B(@NonNull List-someList){ 返回1; } } 我

这个问题类似于,但解决方案不起作用。mockito和Guice有问题

包模拟
导入com.google.inject.persist.Transactional;
导入lombok.NonNull;
导入java.util.ArrayList;
导入java.util.List;
公共类{
公共INTA(){
ArrayList对象=新的ArrayList();
返回此.B(对象);
}
@交易的
public int B(@NonNull List-someList){
返回1;
}
}
我想对A进行单元测试,并检查调用B的参数。因此,我:

@Test
void someTest() {
    SomeClass obj = GuiceConfig.getInjector()
            .getInstance(SomeClass.class);
    SomeClass objSpy = Mockito.spy(obj);
    ArgumentCaptor<List<Object>> captor =
            ArgumentCaptor
                    .forClass(List.class);

    // when(objSpy.B(captor.capture())).thenReturn(1);
    doReturn(0).when(objSpy).B(captor.capture());
}
@测试
无效测试(){
SomeClass obj=GuiceConfig.getInjector()
.getInstance(SomeClass.class);
SomeClass objSpy=Mockito.spy(obj);
辩手=
参数捕获器
.forClass(List.class);
//when(objSpy.B(captor.capture())。然后返回(1);
doReturn(0.when(objSpy.B)(captor.capture());
}

它不是模仿B,而是用null调用B的实际实现并引发NPE。在前面提到的问题中,有人建议使用doReturn可以解决这个问题,因为使用
when(objSpy.B(captor.capture))。然后返回(0)
将执行底层方法。注意,如果我不使用@Transactional,那么它可以工作(当调用失败时)

您能告诉我们您在测试中是如何调用方法A的吗?确保不在obj引用上调用该方法,而是在objSpy@Vladimir是的,我正在打电话给objSpy,但它甚至没有到达那个部分。B之前在Doreturn上被调用实际上这可能是因为您正在使用此引用调用方法B,而mockito创建的代理不知道如何调用存根方法,而是调用真实方法。@Vladimir确实可能发生这种情况,但当我跟踪调试器时,它会在,现在还没有到我打电话给你的时候,你能添加你的测试类吗,你尝试了什么?