java - 如何在 Mockito 中模拟注入(inject)的 bean?

标签 java jakarta-ee junit mockito ejb

此测试有效:

@RunWith(MockitoJUnitRunner.class)
public class Test1 {

    @InjectMocks private MyBean bean;       

    @Test
    public void shouldWork() {      
        bean.test("ABC");       
    }
}

@Stateless
public class MyBean {

    public String test(String s) {
        System.out.println("This is a test " + s);
        return s;
    }
}

现在,我想在 MyBean 中注入(inject)一个新的 EJB MyBean2 并重新测试。为此,我也在 Test1 中模拟 MyBean2。这是新的测试:

@RunWith(MockitoJUnitRunner.class)
public class Test1 {

    @Mock MyBean2 bean2;        
    @InjectMocks MyBean bean;       

    @Test
    public void shouldWork() {
         bean.test("ABC");      
    }

}


@Stateless
public class MyBean {

    @Inject
    MyBean2 bean2;

    public String test(String s) {
        return s + bean2.test2();
    }
}


@Stateless
public class MyBean2 {
    public String test2() {
        return "DEF";
    }
}

但是当我运行这个程序时,当 bean 尝试调用 bean2 方法时,我得到 NullPointerException ,可能是因为 Mockito 没有将注入(inject)的 bean 识别为 EJB。

如何实现这一点?

最佳答案

查看 Javadoc of @InjectMocks 。它指出您必须通过调用您的案例来调用正在使用的模拟的 init:

@RunWith(MockitoJUnitRunner.class)
public class Test1 {
    @InjectMocks
    MyBean bean;
    @Mock
    MyBean2 bean2;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void shouldWork() {
        when(bean2.test2()).thenReturn("mocked return");
        assertThat(bean.test("ABC")).isEqualTo("ABCmocked return");
    }
}

关于java - 如何在 Mockito 中模拟注入(inject)的 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55357180/

相关文章:

java - 如何从其文件中获取证书类型?

java - 如何在 JGit 中执行 git log --no-walk --tags

java - 如何在maven中查看测试失败

java ee 在 OSX 上安装失败

java - 使用 jMock 模拟 javax.mail.message

java - 如何在 Activity 打开时重新加载一次

java.rmi.MarshalException

java - RAD 和 Websphere : How to deploy a war/binary as opposed to the Java code?

java - JSF - JUnit FacesContext 模拟测试

testing - 我可以运行 JUnit 4 以从命令行测试 Scala 代码吗?