【问题标题】:Mock bean is autowired into @Spy bean mockito模拟 bean 自动装配到 @Spy bean mockito
【发布时间】:2021-09-02 20:08:43
【问题描述】:

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

但是这个不行,怎么解决这个问题?

【问题讨论】:

  • 所以你在使用 mockito 并且想知道为什么 spring 自动装配不起作用?
  • 所有 Mockito 模拟返回原始类型的默认值或 null 如果您不存根模拟的行为。考虑这个@Mock vs. @MockBean 解释。接下来,请根据您的测试意图更新您的问题

标签: spring spring-boot unit-testing junit mockito


【解决方案1】:

如果你想在上下文中监视你的 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 的模拟或间谍依赖项:

@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();
    }
}

【讨论】:

    猜你喜欢
    • 2019-02-26
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多