jUnit在测试中跳过injectmock-method中的Method-Call

jUnit skip Method-Call in injectmock-method in a test

我有一个 @InjectMocks cut,这是我要测试的 Class。里面有一个deleteX()和一个init()方法。 deleteX() 在完成之前调用 init() - 我怎么能在我的测试中跳过这个调用,因为每次我只得到一个 NullPointer Exception.

public void deleteX() {
    // some things
    init();
}

我只是想跳过它,因为我有他们两个的测试方法并且不想要大而双的代码。 我不能做 Mockito.doNothing().when(cut).deleteX(); 因为 @InjectMocks 不是 Mockobject.

有一种方法可以实现你想要的 - 它叫做 "partial mocking"。有关详细信息,请参阅此问题 - Use Mockito to mock some methods but not others.

给定一个ClassUnderTest如下:

class ClassUnderTest {

    public void init() {
        throw new RuntimeException();
    }

    public void deleteX() {
        // some things
        init();
    }
}

此测试将通过:

import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.verify;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class ClassUnderTestTest {

    @Spy
    private ClassUnderTest classUnderTest;

    @Test
    public void test() throws Exception {
        // given
        doNothing().when(classUnderTest).init();
        // when
        classUnderTest.deleteX();
        // then
        verify(classUnderTest).init();
    }
}

对带有 @Spy 注释的对象的所有方法调用都是真实的,模拟的除外。在这种情况下,init() 调用被模拟为什么都不做,而不是抛出异常。

如果您需要将依赖项注入到 class 测试中,则需要在 @Before 方法中完成,例如:

private ClassUnderTest classUnderTest;

@Before
public void setUp() {
    ClassUnderTest cut = new ClassUnderTest();
    // inject dependencies into `cut`
    classUnderTest = Mockito.spy(cut);
}