Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何模拟代码中使用的类_Java_Unit Testing_Mockito - Fatal编程技术网

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在问,对于在方法中创建的传输局部变量,他如何用模拟替换它。