Mockbean被自动连接到@Spy-bean mockito中



我的单元测试尝试@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();
}
}

最新更新