Java 依赖注入单元测试

-3 java testing junit dependency-injection

有人可以对这个类进行junit测试吗?

public class MyApplication {
    private EmailService email = new EmailService();

    public boolean processMessages (String msg , String recipient ) {
        if (msg.length ==0 | | recipient.length ==0 ) {
            return false ;
        }
        return this.email.sendEmail (msg , recipient ) ;
    }
}
Run Code Online (Sandbox Code Playgroud)

spr*_*ter 6

您的标题清楚地说明了问题:您没有注入对EmailService. 为此,请添加一个 setter 或(更好) make 并将其final添加到构造函数中。

那看起来像:

public class MyApplication {
    private final EmailService email;

    public MyApplication(EmailService email) {
        this.email = email;
    }

    public boolean processMessages (String msg , String recipient ) {
        if (msg.length == 0 || recipient.length == 0 ) {
            return false ;
        }
        return this.email.sendEmail (msg , recipient ) ;
    }
}
Run Code Online (Sandbox Code Playgroud)

适当的测试可能是(使用 junit 和 mockito):

private MyApplication app;
private EmailService email;

@BeforeEach
void setup() {
    email = mock(EmailService.class);
    when(email.sendEmail(any(), any())).thenReturn(true);
    app = new MyApplication(email);
}

@Test
void testProcessZeroLengthMessageOrPerson() {
    assertFalse(app.processMessages("", "Person"));
    assertFalse(app.processMessages("Message", "")):
    assertFalse(app.processMessages("", "")):
}

@Test
void testProcessMessage() {
    assertTrue(app.processMessage("Message", "Person"));
    verify(email).sendEmail("Message", "Person");
}
Run Code Online (Sandbox Code Playgroud)