服务java中的模拟资源(mockito)

服务java中的模拟资源(mockito),java,mockito,Java,Mockito,我正在为导出类做一些测试 我需要模仿一个方法,所以我做了一个模仿(我是新来的模仿) 及 我需要模拟getPath()方法,就像我在TestNG中所做的那样 public class ExportTestNG(){ public textExport(){ Service serviceMock = Mockito.mock(Service.class); Mockito.when(serviceMock.getData()).thenReturn("theNew

我正在为导出类做一些测试 我需要模仿一个方法,所以我做了一个模仿(我是新来的模仿)

我需要模拟getPath()方法,就像我在TestNG中所做的那样

 public class ExportTestNG(){

    public textExport(){

     Service serviceMock = Mockito.mock(Service.class);
     Mockito.when(serviceMock.getData()).thenReturn("theNewPath");
     System.out.println("serviceMock.getData() : " + serviceMock.getData()); // prints "theNewPath", OK

     exportService.export();  // the getData() is not the mockito one

    }
 }
我可能没有纠正mockito,也可能不理解它是如何工作的。
有什么想法吗?

您需要将模拟服务连接到exportService对象中。 如果您有服务成员变量的setter,请执行以下操作:

exportService.setService(serviceMock);// add this line.
exportService.export();
如果没有setter,则需要在调用export之前执行连接。 这方面的选择包括:

  • 使用反射设置服务成员变量的值

  • 编写服务的仅测试版本,并使用spring配置xml文件的仅测试版本
  • 其他事情(我从未做过,因此不知道)

您需要将模拟服务连接到exportService对象中。 如果您有服务成员变量的setter,请执行以下操作:

exportService.setService(serviceMock);// add this line.
exportService.export();
如果没有setter,则需要在调用export之前执行连接。 这方面的选择包括:

  • 使用反射设置服务成员变量的值

  • 编写服务的仅测试版本,并使用spring配置xml文件的仅测试版本
  • 其他事情(我从未做过,因此不知道)

您可以使用Mockito为您注入mock,避免添加setter方法

@RunWith(MockitoJUnitRunner.class)
public class ExportTestNG(){

    @InjectMocks
    private ExportServiceImpl exportService;

    @Mock
    private Service serviceMock;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    public textExport(){                            
        Mockito.when(serviceMock.getData()).thenReturn("theNewPath");
        exportService.export(); 
    }
}

您可以使用Mockito为您注入mock,并避免添加setter方法

@RunWith(MockitoJUnitRunner.class)
public class ExportTestNG(){

    @InjectMocks
    private ExportServiceImpl exportService;

    @Mock
    private Service serviceMock;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    public textExport(){                            
        Mockito.when(serviceMock.getData()).thenReturn("theNewPath");
        exportService.export(); 
    }
}

可能重复的可能重复的非常感谢!这真的很有帮助!“只编写服务的测试版本”否!然后,您测试的是从未使用过的代码,而不是正在使用的代码。浪费时间。仅测试版本的服务是为了支持exportService的测试,就像使用模拟库一样。被测试的代码不是该服务的仅测试版本,而是使用该服务的仅测试版本的类。啊,那么是一个模拟服务。这通常就是它的名称。非常感谢!这真的很有帮助!“只编写服务的测试版本”否!然后,您测试的是从未使用过的代码,而不是正在使用的代码。浪费时间。仅测试版本的服务是为了支持exportService的测试,就像使用模拟库一样。被测试的代码不是该服务的仅测试版本,而是使用该服务的仅测试版本的类。啊,那么是一个模拟服务。这通常被称为+1。添加一个只在测试中使用的setter是一个讨厌的习惯PI除了在exportService中添加InjectMock外,还需要添加Autowired,它可以正常工作!你不需要initMocks调用,Though@RunWith涵盖了这一点。+1添加仅在测试中使用的setter是一个令人讨厌的习惯PI除了在exportService中添加InjectMock外,还需要添加Autowired,它可以正常工作!你不需要initMocks调用,Though@RunWith涵盖了这一点。