通过Mockito调用@Autowire bean

时间:2019-04-16 12:19:09

标签: mockito

我有Class A和ClassB。B是在Class A中自动接线的。现在我想使用Mockito测试流程。

问题是,当我尝试使用@InjectMock在测试用例中模拟类A和类B时,它去了类A,但没有调用类B。

我不想模拟在A类中自动装配的B类,它应该从A类调用B类并获取用户详细信息数据。

@Component
public class A {

    @Autowired
    private B b;

    public Users getUsers() {
        Long id = 10;
        b.getUserDetails(id);
// some Logic 

    }

}

@Component
public class B {

    public UserDetails getUserDetails(Long id) {
        // some logic to get users details .. 
    }
}


@RunWith(MockitoJUnitRunner.class)
public class TestA {

    @InjectMocks
    private A a;

    @InjectMocks
    private B b;


    @Test
    public void testA() {
        Users actual = a.getUsers();

        assertEquals(actual, expected());
        assertNotNull(actual);

    }

    private Users expected() {
        return new Users(); // expected users object 
    }


}

2 个答案:

答案 0 :(得分:2)

您应该在B上使用@Spy才能使用真正的B

@Spy
private B b;
  

间谍将包装现有实例。它的行为仍与普通实例相同-唯一的区别是,它还将被用来跟踪与其进行的所有交互。

答案 1 :(得分:0)

您应该将B上方的 @InjectMocks 注释更改为 @Spy ,并且还应将A上方的 @Spy 添加。因为您想使用 B.class A.class 的实际方法。为什么需要使用 @Spy

如果您对所有方法都使用 @Mock ,默认情况下,mock返回null,空集合或适当的原始/原始包装值(例如0,false,null等)

如果您使用 @Spy ,则将调用实际方法(除非已存入方法)。

因此,您在 TestA.class 中创建的内容应类似于:

  

@Spy @InjectMocks私人A a;

     

@间谍私人B b;