【发布时间】:2021-11-28 07:00:42
【问题描述】:
我有以下流程
@InjectMocks private ClassToTest classToTest;
@Mock private ClassToInject classToInject;
@Before
public void setup() {
initMocks(this);
}
@Test
public void test() {
Classx mockClassObj = Mockito.mock(Classx.class);
when(classToInject.publicMethod1(mockClassObj)).thenReturn(1000);
classToTest.publicMethod();
}
我想测试 classToTest 的公共方法。现在这个方法调用了一个私有方法,我不是在嘲笑它。在这个私有方法中调用了另一个公共方法,我想模拟publicMethod1。而不是使用值 1000 的私有方法,它的行为就好像 publicMethod1 没有被模拟,我在某处的方法流中得到了 NPE。我尝试将@Spy 与classToTest 一起使用,并且我正在使用 init.mocks/@RunWith 但它失败了。
简而言之就是这样
ClassToTest。 publicMethod --> ClassToTest.privateMethod(不是模拟) --> ClassToInject.publicMethod1(想模拟)
类如下所示
class ClassToTest {
@Inject ClassToInject classToInject;
public publicMethod() {
privateMethod();
}
private privateMethod() {
int x = classToInject.publicMethod1();
// use the return value
// throw exception
}
【问题讨论】:
-
你能把你正在测试的类的代码吗?
-
添加了骨架
-
顺便说一句,与您的 NPE 无关,但 ..
classToInject.publicMethod1(mockClassObj)是无用的,因为mockClassObj是在测试中创建的。 SUT 中使用的Classx的任何值/实例都不会匹配,因此它不会返回 1000。 -
检查模拟注入是否成功 - 打印
classToInject并查看它是来自 Mockito 还是为空(或在 IDE 中放置断点并检查其 toString)。 -
测试代码与实际代码(方法契约)存在一定差异。要隔离问题,请测试我上面建议的内容。如果结果为 null,则意味着某些东西正在封装 InjectMocks 注入模拟实例,而 Mockito 不会报告任何错误。
标签: java unit-testing mockito