Junit 如何使用mockito库进行有效测试?
上下文 我有一个使用mockito库测试的简单方法 问题 我有一个错误: “[MockitoHint]ReceiveServiceTest.testGetFileDto(有关MockitoHint,请参阅javadoc): [MockitoHint]1.未使用…->at.ReceiveServiceTest.testGetFileDto(ReceiveServiceTest.java:46) [MockitoHint]…参数是否正常?->位于ReceiveService.getFileDto(ReceiveService.java:28) 我不明白怎么回事 代码Junit 如何使用mockito库进行有效测试?,junit,mockito,Junit,Mockito,上下文 我有一个使用mockito库测试的简单方法 问题 我有一个错误: “[MockitoHint]ReceiveServiceTest.testGetFileDto(有关MockitoHint,请参阅javadoc): [MockitoHint]1.未使用…->at.ReceiveServiceTest.testGetFileDto(ReceiveServiceTest.java:46) [MockitoHint]…参数是否正常?->位于ReceiveService.getFileDto(R
@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
}
@RunWith(MockitoJUnitRunner.class)
公共类ReceiveServiceTest{
private List filepath=new ArrayList();
@注射模拟
私人接收服务接收服务;
@嘲弄
私人FindFiles FindFiles;
@嘲弄
私有读取字节;
@以前
在()之前公开无效{
添加(新文件(“d://folder//test1\u message\u received”);
添加(新文件(“d://folder//test2\u message\u received”);
添加(新文件(“d://folder//test3\u message\u received”);
}
@试验
public void testGetFileDto()引发IOException{
//给定
字节[]结果字节=新字节[1028];
当(findfiles.getPathFiles())。然后返回(filepath);
当(readByte.readByteArrFromFile(新文件(“d://folder//test3\u message\u received”))。然后返回(resultbyterar);
List result=receiveService.getFileDto();
//有人断言
}
方法
@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;
}
@Autowired
私人FindFiles FindFiles;
@自动连线
私有读取字节;
公共列表getFileDto()引发IOException{
List fileDtos=new ArrayList();
对于(文件:findFiles.getPathFiles()){
fileDtos.add(新消息dto(Base64.getEncoder().encode(readByte.readByteArrFromFile)(新文件(File.getPath())),
file.getName(),“zip”,null));
}
返回filedto;
}
我认为模拟没有被初始化。请在@Before
方法中初始化模拟
@Before
public void init() {
initMocks(this);
}
我想这应该可以解决问题。您的问题是,您在下面的行中创建了一个新对象:
when(readByte.readByteArrFromFile(new File("d://folder//test3_message_received"))).thenReturn(resultByteArr);
Mockito需要知道哪个真实对象被传递给该方法,以便它可以返回相应的然后返回
-值。因此,如果您将实际引用传递给它,代码将工作,但也只有在您指定列出的所有值时才能工作。否则,您可能会得到NullPointerException
顺便说一下,调用新文件(File.getPath())
对我来说似乎是多余的。您可以使用文件来代替
因此,使用以下代码可能会更好:
when(readByte.readByteArrFromFile(filePaths.get(0)).thenReturn(resultByteArray);
但是您需要为所有条目指定它
或者,使用匹配器
:
when(readByte.readByteArrFromFile(ArgumentMatchers.any(File.class))).thenReturn(resultByteArr);
或者指定所需的实际参数匹配,因为匹配器在这方面非常强大
之前的答案包含以下内容,这些内容仍然正确,但没有上面的答案那么简洁:
我已经很久没有使用mock了(我甚至为此感到骄傲;-)
这条消息已经指出,人们应该咨询一下,我在那里发现了以下内容:
这些都是提示——它们不一定100%都是真实的问题
尽管如此,我认为问题在于以下陈述:
when(readByte.readByteArrFromFile(new File("d://folder//test3_message_received"))).thenReturn(resultByteArr);
我认为您需要为文件路径中的每个条目指定一个返回值,或者使用匹配器使调用更通用。any()
(或任何其他合适的匹配器
)。以下是我问题的解决方案。我添加了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());
//给定
字节[]mockByteArr=新字节[2048];
当(findfiles.getPathFiles())。然后返回(filepath);
用于(文件路径:文件路径){
当(readByte.readByteArrFromFile(新文件(filePath.getPath())))。然后返回(mockByteArr);
}
//什么时候
List result=receiveService.getFileDto();
//然后
assertEquals(3,result.size());
assertEquals(mockByteArr,result.get(1.getContent());
不要在应用程序/测试中使用绝对文件路径。始终使用相对路径/资源加载,并将测试中使用的文件也添加到SCM存储库中。为接口/实现使用更好的名称:FindFile->FileFinder->或更具体的名称,例如ScenarioFileFinder ReadByte->ByTereader您可以添加c吗对应的行号(28和46)作为您问题中的代码注释?只是为了确保其他人也看到了正确的代码行。如果我的回答以任何方式给了您提示,例如“我认为您需要为每个条目指定一个返回值。”“,然后请随意更新。顺便说一句,我刚刚再次下载了mockito并更新了我的答案,以解释您最初的方法不起作用的原因。关于您的下一个问题,请更新您的问题或提出新的问题(取决于更合适的问题)。这也可以通过问题中的编辑注释反映出来。getContent()
返回什么?