如何对使用尚未作为方法参数实现的接口的 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
参数使用任何方法调用。因此,您可以简单地模拟您的界面,如上所述。
我不知道如何对使用尚未作为方法参数实现的接口的 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
参数使用任何方法调用。因此,您可以简单地模拟您的界面,如上所述。