如何使用模仿库进行有效测试?

时间:2018-07-24 19:45:58

标签: junit mockito

上下文 我有一个简单的方法正在使用模仿库进行测试。

问题 我有一个错误:

“ [[MockitoHint] ReceiveServiceTest.testGetFileDto(有关MockitoHint的信息,请参见javadoc): [MockitoHint] 1.未使用...-> .ReceiveServiceTest.testGetFileDto(ReceiveServiceTest.java:46) [MockitoHint] ... args好吗? ->在ReceiveService.getFileDto(ReceiveService.java:28)

我不明白方式。

代码

@RunWith(MockitoJUnitRunner.class)
public class ReceiveServiceTest {
private List<File> filePaths = new ArrayList<>();

@InjectMocks
private ReceiveService receiveService;

@Mock
private FindFiles findfiles;

@Mock
private ReadByte readByte;



@Before
public void before() {
    filePaths.add(new File("d://folder//test1_message_received"));
    filePaths.add(new File("d://folder//test2_message_received"));
    filePaths.add(new File("d://folder//test3_message_received"));
}

@Test
public void testGetFileDto() throws IOException {

    // Given
    byte[] resultByteArr = new byte[1028];
    when(findfiles.getPathFiles()).thenReturn(filePaths);
    when(readByte.readByteArrFromFile(new File("d://folder//test3_message_received"))).thenReturn(resultByteArr);

    List<MessageDTO> result = receiveService.getFileDto();
    //some assert
    }

方法

@Autowired
private FindFiles findFiles;

@Autowired
private ReadByte readByte;

public List<MessageDTO> getFileDto() throws IOException {
    List<MessageDTO> fileDtos = new ArrayList<>();
    for (File file : findFiles.getPathFiles()) {
        fileDtos.add(new MessageDTO(Base64.getEncoder().encode(readByte.readByteArrFromFile(new File(file.getPath()))),
                file.getName(), "zip", null));
    }
    return fileDtos;
}

3 个答案:

答案 0 :(得分:0)

我认为模拟尚未初始化。请使用@Before方法初始化模拟。

@Before
public void init() {
    initMocks(this);
}

这应该可以解决我猜到的问题。

答案 1 :(得分:0)

您的问题是,您在以下行中创建了一个新对象:

when(readByte.readByteArrFromFile(new File("d://folder//test3_message_received"))).thenReturn(resultByteArr);

Mockito需要知道将哪个实际对象传递给方法,以便它可以返回适当的thenReturn值。因此,如果您将实际引用传递给它,则您的代码将起作用,但也仅当您指定列出的所有值时才起作用。否则,您可能会得到NullPointerException

顺便说一句,打电话给new File(file.getPath())对我来说似乎是多余的。您可以只使用file

因此,使用以下代码可能会更好地工作:

when(readByte.readByteArrFromFile(filePaths.get(0)).thenReturn(resultByteArray);

,但是您需要为所有条目指定它。

或者,使用Matcher代替:

when(readByte.readByteArrFromFile(ArgumentMatchers.any(File.class))).thenReturn(resultByteArr);

或指定所需的实际参数匹配,因为匹配器在这方面可能非常强大。

以前,答案包含以下内容,但仍然是正确的,但不如上面的答案那么简洁:

自上次使用模拟以来已经有很长时间了(我为此感到骄傲;-)。

该消息已经表明应该咨询javadoc,而我发现以下内容:

  

这些都是提示-它们不一定100%地表示实际问题。

尽管如此,我认为问题在于以下陈述:

when(readByte.readByteArrFromFile(new File("d://folder//test3_message_received"))).thenReturn(resultByteArr);

我认为您需要为filePaths 中的每个条目指定一个返回值,或者使用Matchers.any()(或任何其他适当的Matcher )。

答案 2 :(得分:0)

这是我的问题的解决方案。我添加了foreach循环。现在该模拟有效,但是byte []与它应返回的内容不同。

// Given
    byte[] mockByteArr = new byte [2048];
    when(findfiles.getPathFiles()).thenReturn(filePaths);
    for (File filePath : filePaths) {
        when(readByte.readByteArrFromFile(new File(filePath.getPath()))).thenReturn(mockByteArr);
    }
    //When
    List<MessageDTO> result = receiveService.getFileDto();
    //Then
    assertEquals(3, result.size());
    assertEquals(mockByteArr, result.get(1).getContent());