如何对使用尚未作为方法参数实现的接口的 class 执行 JUnit 测试?

How to perform JUnit testing on a class that uses interfaces not yet implemented as method parameters?

我不知道如何对使用尚未作为方法参数实现的接口的 class 执行 Junit 测试。不知道接口的实现所以没法实现

比如我有这个界面

public interface Command{
     public void execute();
     ....
} 

和class使用接口作为方法参数。

public class Manager{
    List<Command> listCommands = new List<Command>();

    public void storeCommand(Command command){
       listCommands.add(command);
    }
}

我在网上看到一种解决方案可能是使用 mockito 来模拟接口的实现,但我不确定。

谢谢!

是的,您可以像这样使用 mockito 模拟接口的实现:

Command mockedCommand = Mockito.mock(Command.class)

然后您可以开始模拟将在您的测试中使用的接口的每个方法,指定它将使用什么 return。

首先,让自己熟悉 单元测试 上下文中的 mocking 概念,因为通过问这个问题,你证明了,你不是。

然后选择一些 mocking Framework 坚持使用。 Mockito 不错,而且可能是最受欢迎的。

最后,我不会(不能)教您使用此框架可以利用的所有模拟功能,但这是如何模拟您的类型的一个示例(是它是一个接口或 class),以及 如何 配置模拟实例以使其表现得像您希望的那样:

import static org.mockito.Mockito.*;

class YourTestFixture {

    @Test
    public void yourTest()  {
        //create mock
        Command commandMock = mock(Command.class);

        //configure execute() method's return value
        when(commandMock.execute()).thenReturn("your expected value");

        //your assertions..

    }
}

现在,每次您在该特定实例 (commandMock) 上调用 .execute() 时,它将始终 returning "your expected value".

注意,你可以让它抛出一个异常,或者 return null.. 或者只是做任何你想让它做的事情,但是 returning object/value 必须是声明为 returning.

的任何方法的类型(或子类型)

请注意,在您的示例中:

public class Manager{
    List<Command> listCommands = new List<Command>();

    public void storeCommand(Command command) {
        listCommands.add(command);
    }
}

您甚至没有对 command 参数使用任何方法调用。因此,您可以简单地模拟您的界面,如上所述。