Java 如何模拟代码中使用的类
当我为此编写单元测试时,因为我不想实际发送邮件,所以我想模拟Java 如何模拟代码中使用的类,java,unit-testing,mockito,Java,Unit Testing,Mockito,当我为此编写单元测试时,因为我不想实际发送邮件,所以我想模拟Transport类。有可能吗?如果有,怎么做?'cglib'可能适合 使用“增强器”代理“传输”类。为了不实际发送邮件,您需要将一个“MethodInterceptor”传递到“Enhancer”中,它不会调用超类中的“send()”方法。除非您真的想使用mockito,否则您可以很容易地手工编写自己的测试程序 您可以创建一个知道如何发送邮件的界面: public void sendMail() { /* I have s
Transport
类。有可能吗?如果有,怎么做?'cglib'可能适合使用“增强器”代理“传输”类。为了不实际发送邮件,您需要将一个“MethodInterceptor”传递到“Enhancer”中,它不会调用超类中的“send()”方法。除非您真的想使用mockito,否则您可以很容易地手工编写自己的测试程序 您可以创建一个知道如何发送邮件的界面:
public void sendMail() {
/* I have simplified the method for here */
Transport t;
t.send();
}
让邮件发送类使用此接口发送邮件:
public interface TransportInterface {
public void send(Message msg);
}
public class MailSender {
private TransportInterface transport;
public MailSender(TransportInterface transport) {
this.transport = transport;
}
public void sendMail(Message msg) {
/* This is the method from your question */
this.transport.send(msg);
}
}
在生产中,您使用实际发送邮件的TransportInterface
实现:
public interface TransportInterface {
public void send(Message msg);
}
public class MailSender {
private TransportInterface transport;
public MailSender(TransportInterface transport) {
this.transport = transport;
}
public void sendMail(Message msg) {
/* This is the method from your question */
this.transport.send(msg);
}
}
在您的测试代码中,您可以使用假代码:
public class TransportAdapter implements TransportInterface {
private Transport transport; // Created elsewhere...
public void sendMail(Message msg) {
transport.send(msg);
}
}
(我编写java代码已经有一段时间了。希望不会有太多错误。此外,您可以比我更好地命名类。)您可以尝试使用Mockito库: 下面是示例代码:
public class TransportFake implements TransportInterface {
public void sendMail(Message msg) {
// I don't send the mail!
}
}
无论如何获得
Transport t
对象,此解决方案都有效:
import org.mockito.Mock;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class YourTestClass{
@Mock
Transport t;
@Test
public void someTest(){
t = Mockito.mock(Transport .class);
Mockito.when(t.send()).thenReturn(true);
}
}
上面使用的模拟API是JMockit(我开发的)。您如何创建
传输
对象?你在使用一个你可以模仿的工厂吗?您可能会从我在Mockito wiki上的文章中得到一些信息,如果您使用@RunWith(MockitoJUnitRunner.class)
和@Mock
注释,您不需要在测试中使用Mockito.Mock
手动创建Mock。更重要的是,我认为OP在问,对于在方法中创建的传输局部变量,他如何用模拟替换它。