上下文 我有一个简单的方法正在使用模仿库进行测试。
问题 我有一个错误:
“ [[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;
}
答案 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());