gpt4 book ai didi

java - 在 Java 中模拟匿名类

转载 作者:行者123 更新时间:2023-11-30 10:02:46 24 4
gpt4 key购买 nike

我正在学习依赖注入(inject)和使用 Mockito 进行测试。我刚刚找到了一个教程,其中有人解释了使用依赖注入(inject)和不使用依赖注入(inject)的应用程序。这是链接:https://www.journaldev.com/2394/java-dependency-injection-design-pattern-example-tutorial

我有两个问题:

第一个问题是关于他编写的用于测试的代码。那是什么样的模拟?你不需要使用@Mock 来模拟一个对象吗?

这是他的测试代码:

public class MyDIApplicationJUnitTest {

private MessageServiceInjector injector;
@Before
public void setUp(){
//mock the injector with anonymous class
injector = new MessageServiceInjector() {

@Override
public Consumer getConsumer() {
//mock the message service
return new MyDIApplication(new MessageService() {

@Override
public void sendMessage(String msg, String rec) {
System.out.println("Mock Message Service implementation");

}
});
}
};
}

@Test
public void test() {
Consumer consumer = injector.getConsumer();
consumer.processMessages("Hi Pankaj", "pankaj@abc.com");
}

@After
public void tear(){
injector = null;
}

}

第二个问题是关于在没有依赖注入(inject)的情况下测试应用程序。我不明白他为什么这么说:“测试应用程序将非常困难,因为我们的应用程序直接创建电子邮件服务实例。我们无法在测试类中模拟这些对象。”为什么我们不能在我们的测试用例中模拟这些对象。

最佳答案

The first question is about the code that he writes for testing. What kind of mock is that? Don't you need to use @Mock to mock an object?

要模拟一个对象,您必须提供一个具有相同类型的对象,即行为相同或者是您要模拟的对象的类的子类型。因此,要模拟一个对象,您可以使用匿名类的实例(在您的情况下,它将是扩展 MyDIApplication 的匿名类的对象),或者您可以使用 Mockito 及其 @Mock基本上做类似事情的注释。基本上使用 @Mock注释类似于做:

MyDIApplication myDiApplication = Mockito.mock(MyDIApplication.class)

它创建一个模拟对象,扩展在构造函数中传递的类。在这里,您可以根据要模拟的内容传递接口(interface)或类。

当使用匿名类时,您提供了您想要在重写的方法实现中模拟的方法的实现,但在 Mockito 的情况下,您通过使用像 Mockito::when 这样的方法来提供预期的行为。 .

And the second question is about testing the app without dependency injection. I don't understand why he say that: "Testing the application will be very difficult since our application is directly creating the email service instance. There is no way we can mock these objects in our test classes." Why we cannot mock these objects in our test cases.

我猜你指的是这段代码:

public class MyApplication {

private EmailService email = new EmailService();

public void processMessages(String msg, String rec){
//do some msg validation, manipulation logic etc
this.email.sendEmail(msg, rec);
}
}

这里你创建了一个 EmailService 的实例作为类字段。所以你不可能模拟这个(尽管你可以使用反射或 PowerMock)。所以你与 EmailService 紧密耦合而且很难测试MyApplication类逻辑。为了能够测试它,您可以使用构造函数注入(inject):

public class MyApplication {

private EmailService email;

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

public void processMessages(String msg, String rec){
//do some msg validation, manipulation logic etc
this.email.sendEmail(msg, rec);
}
}

或者 setter 注入(inject):

public class MyApplication {

private EmailService email;

public void setEmailService(EmailService emailService) {
this.email = emailService;
}

public void processMessages(String msg, String rec){
//do some msg validation, manipulation logic etc
this.email.sendEmail(msg, rec);
}
}

关于java - 在 Java 中模拟匿名类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56634861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com