Junit 如何使用mockito库进行有效测试?

Junit 如何使用mockito库进行有效测试?,junit,mockito,Junit,Mockito,上下文 我有一个使用mockito库测试的简单方法 问题 我有一个错误: “[MockitoHint]ReceiveServiceTest.testGetFileDto(有关MockitoHint,请参阅javadoc): [MockitoHint]1.未使用…->at.ReceiveServiceTest.testGetFileDto(ReceiveServiceTest.java:46) [MockitoHint]…参数是否正常?->位于ReceiveService.getFileDto(R

上下文 我有一个使用mockito库测试的简单方法

问题 我有一个错误:

“[MockitoHint]ReceiveServiceTest.testGetFileDto(有关MockitoHint,请参阅javadoc): [MockitoHint]1.未使用…->at.ReceiveServiceTest.testGetFileDto(ReceiveServiceTest.java:46) [MockitoHint]…参数是否正常?->位于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
    }
@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()
返回什么?