如何使用Junit Mockito模拟惰性初始化Bean

rxztt3cl  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(141)

我有一个类,我在构造函数中使用惰性初始化自动连接它。但是我无法使用@Mock模拟它。它在我的测试类中抛出空指针异常。

@Transactional
@Repository
public class A{
 private  B b;

  @Autowired
  public A(@Lazy B b {
      this.b= b;
  }
}  

Iam unable to mock the bean B.My test class is as follows.

@RunWith(MockitoJUnitRunner.class)
public class ATest{

  @Rule
  public ExpectedException thrown = ExpectedException.none();


  @InjectMocks
  A a;
  @Mock
  B b;
  Mockito.when(b.methodCall()).thenReturn("test");
}

字符串
上面的代码返回空指针异常,因为我无法模拟类B。请让我知道如何模拟这个。

brjng4g3

brjng4g31#

我很确定这不是最好的解决方案,但我使用反射解决了它

@Before
    public void before() {
        ReflectionUtils.setField(ReflectionUtils.findRequiredField(A.class, "b"), a, b);
    }

字符串

pbpqsu0x

pbpqsu0x2#

您正在使用构造函数注入,@Autowired@Lazy注解应该位于方法上方。请尝试:
A级:

@Transactional
@Repository
public class A {

    private B b;

    @Autowired
    @Lazy
    public A(B b) {
        this.b = b;
    }
}

字符串
B类:

@Component
public class B {

    public String methodCall() {
        return "foo";
    }
}


测试类别:

@RunWith(MockitoJUnitRunner.class)
public class MyTest {

    @InjectMocks
    private A a;

    @Mock
    private B b;

    @Before
    public void before() {
        Mockito.when(b.methodCall()).thenReturn("test");
    }

    @Test
    public void myTest() {
        assertEquals(b.methodCall(), "test");
    }
}

xxls0lw8

xxls0lw83#

@InjectMocks注解代码似乎有一个bug。构建和运行应用程序对我来说很好,但是如果Autowired字段而不是构造函数参数,@InjectMocks无法注入Lazy。

private final Service1 s1;

@Autowired
@Lazy
private Service2 s2;

public ParentImpl (
    Service1 s1
) {...}

字符串
s2为null

我的解决方案:

但是,如果我将Lazy服务注入到构造函数中,它就可以正常工作。

private final Service1 s1;

private final Service2 s2;

public ParentImpl (
    Service1 s1,
    @Lazy Service2 s2
) {...}


^^ s2按预期填充

相关问题