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);
}
我有一个 @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);
}