我的单元测试尝试@Spy-beanA。但是BeanA@autowire bean B如下:
@RunWith(SpringRunner.class)
public class MyServiceImplTest {
@Spy
private BeanA beanA;
@InjectMocks
private MyService myService = new MyServiceImpl();
@Test
public void testDoSomeThing(){
myService.doSomeThing();
}
}
MyServiceImpl如下所示:
@Service
public class MyServiceImpl {
@Autowired
private BeanA beanA;
public doSomeThing(){
....
beanA.beanADoSomeThing()
....
}
}
beanA如下
@Service
public class BeanA {
@Autowired
private BeanB beanB;
public beanADoSomeThing(){
...
//Null pointer exception in here because beanB=null
beanB.beanBDoSomeThing()
}
}
当运行单元测试时,我在beanB.beanBDoSomeThing()
行得到空指针异常,我可以理解原因,但如何解决这个问题?
我试过
@Mock
private BeanB beanB;
但这不起作用,如何解决这个问题?
如果你想在上下文中监视你的bean,你需要@SpyBean
注释而不是@Spy
,而且你应该自动连接你的服务进行测试,smth如下:
@SpringBootTest
@RunWith(SpringRunner.class)
public class ExTest {
@SpyBean
private BeanA beanA;
@Autowired
private MyService myService;
@Test
public void testDoSomeThing() {
myService.doSomeThing();
}
}
如果您不想单独加载应用程序上下文并只测试MyServiceImpl
行为,可以使用纯Mockito和MyServiceImpl
:的mock或spy依赖关系
@RunWith(MockitoJUnitRunner.class)
public class MockitTest {
@InjectMocks
private MyServiceImpl myService;
@Mock
private BeanA beanA;
@Test(expected = RuntimeException.class)
public void test() {
doThrow(new RuntimeException()).when(beanA).beanADoSomeThing();
myService.doSomeThing();
}
}