使用 @Mock 时,我的 @Test 不起作用,尽管通过简单的调试进行验证完全有效,但我不明白如何使用 Mocks,我正在测试的内容非常简单:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
public class SepaRoutingFromXMLTest {
@Mock
SepaRoutingUtils sepa;
@Test
public void existValidOneFullXMLFileInFolder() throws Exception {
assertThat("ARCHIVE_20141224.xml", containsString(".xml"));
assertThat(sepa.readSepaXMLFile(), containsString("ARCHIVE_"));
}
}
第一个assertThat
工作没有问题并且非常基本,但是第二个显然同样微不足道,返回给我:
Expected: a string containing "SEPAROUTING_V3_FULL_" but: was null
如您所见,我正在模拟:
@Component
public class SepaRoutingUtils {
public String readSepaXMLFile() {
return "ARCHIVE_20141224.xml";
}
}
这对我来说基本上是一样的,但我意识到我不明白@Mock 是如何工作的,我也不能做那个类的@Autowired,因为我认为它不应该在@Test 中完成。
我看到进行以下修改可以正常工作:
@RunWith(SpringRunner.class)
public class SepaRoutingFromXMLTest {
@Test
public void existValidOneFullXMLFileInFolder() throws Exception {
SepaRoutingUtils sepa = new SepaRoutingUtils();
assertThat(sepa.readSepaXMLFile(), containsString(".xml"));
assertThat(sepa.readSepaXMLFile(), containsString("ARCHIVE_"));
}
}
但是,这样做对我没有帮助,因为在课堂上SepaRoutingUtils
我必须使用@Value 获得一个值:
@Value("${from.folder}")
private String FROM_FOLDER;
我知道我可能错了几个概念。
课程更新SepaRoutingUtils
@Component
public class SepaRoutingUtils {
@Value("${from.folder}")
private String FROM_FOLDER;
private File readSepaFolder() {
File folder = new File(FROM_FOLDER);
if(!folder.isDirectory()) {
throw new FolderAccessDeniedException();
}
return folder;
}
public String readSepaXMLFile(SepaRoutingFileType fileType) {
try {
return Utils.prepareXMLFile(readSepaFolder(), fileType).getName();
}
catch (ParseException e) {
e.printStackTrace();
throw new NotValidFileException();
}
}
}
补充@SJuan76 的普遍正确答案。
对于您的特定情况,您想要模拟一个您不能做的私有成员,
@Mock/@Spy
因为它是一个最终类(字符串)一种可能的解决方案是使用反射向该字符串添加可测试的值:
您
mocks
可以替换您测试的代码所依赖的组件。通过这种方式,您可以测试组件,而无需依赖更换的组件是否正常工作。您的组件执行以下操作1:
你如何测试
getSuma()
?您获得的值将取决于它persistencia.getNumeros()
返回的内容,因此如果您不控制您将无法进行测试(或者至少,您将无法验证结果)。所以
是的,你可以“手写”你的实现
MiComponentePersistencia
来做同样的事情。简单的框架mock
使您的任务更容易。1实际上,我在 Java EE 和 Mockito 方面的经验比在 Spring 方面的经验要多,所以如果关于 Spring 的某些地方不太正确,请见谅。