如何使用JUnit和/或Mockito测试void方法

sango.gif

提前致歉-我知道已经被问了一千遍了,但是我浏览了这么多的文章/文档,我实在是太丢脸了。

我有一个接收XML文件的类,然后使用DocumentBuilder将其解析为一个新文件,该文件将用作其他类使用的源。

我需要测试我的方法(无效)。我的项目已经完成,但是我需要测试。

如果有人愿意向我展示如何完成此操作,则可以继续使用其他类,并遵循相同的逻辑,因为项目中90%的方法均不返回任何内容。

谢谢...

 public class XmlToCsv {


    public static void xmlToCsv(String sourceXlsFile, String sourceCsvFile, String sourceXmlFile) throws Exception {

        //define the files
        File stylesheet = new File(sourceXlsFile);
        File xmlSource = new File(sourceXmlFile);

        //create the DocumentBuilder to parse the XML file
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(xmlSource);

        //input the stylesheet to transform the XML to
        StreamSource stylesource = new StreamSource(stylesheet);
        Transformer transformer = TransformerFactory.newInstance().newTransformer(stylesource);

        //write a new output file using the stylesheet format
        Source source = new DOMSource(document);
        Result outputTarget = new StreamResult(new File(sourceCsvFile));
        transformer.transform(source, outputTarget);

    }
}
斯文

您实际上想做的不是做到这一点的方法。你应该只测试XmlToCsv类,而不是由这个类使用的类(DocumentBuilderFactoryDocumentBuilderDocumentStreamSourceTransformerSourceResult)。

现在有两种方法可以使用:干净的代码方法或肮脏的测试方法。

最好的解决方案是为所使用的类提供一个依赖框架:

public class XmlToCsv {

    @Inject
    DocumentBuilderFactory factory;

    @Inject
    StreamSource stylesource;

    @Inject
    TransformerFactory transformerFactory;

    public void xmlToCsv(String sourceXlsFile, String sourceCsvFile, String sourceXmlFile) throws Exception {

        //define the files
        File stylesheet = new File(sourceXlsFile);
        File xmlSource = new File(sourceXmlFile);

        //create the DocumentBuilder to parse the XML file
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(xmlSource);

        //input the stylesheet to transform the XML to
        StreamSource stylesource = new StreamSource(stylesheet);
        Transformer transformer = transformerFactory.newInstance().newTransformer(stylesource);

        //write a new output file using the stylesheet format
        Source source = new DOMSource(document);
        Result outputTarget = new StreamResult(new File(sourceCsvFile));
        transformer.transform(source, outputTarget);

    }
}

现在可以通过将模拟注入到可注入字段中来完成测试:

@RunWith(MockitoJUnitRunner.class)
public class XmlToCsvTest {
    @Mock
    DocumentBuilderFactory factory;

    @Mock
    StreamSource style source;

    @Mock
    TransformerFactory transformerFactory;

    @InjectMocks
    XmlToCsv sut; // System Under Test

    @Test
    public void testOk() throws Exception {
        // Mocks
        DocumentBuilder documentBuilder = Mockito.mock(DocumentBuilder.class);
        Document document = Mockito.mock(Document.class);
        // Now you control all objects created in the class and you can test if the right methods are called

        // when-clauses
        Mockito.when(factory.newDocumentBuilder).thenReturn(documentBuilder);
        Mockito.when(documentBuilder.parse(any(File.class)).thenReturn(document);
        // Add all when's here

        // now call the class
        sut.xmlToCsv("", "", "");

        // now verify all calls
        verify(factory, times(1)).newDocumentBuilder();
        verify(documentBuilder, times(1)).parse(any(File.class));
        // etc.
    }
}

肮脏的方法是使用PowerMockito。使用PowerMockito,您可以覆盖现有类的新方法。这确实是不得已的办法,我不建议这样做,但是当您无法更改源代码时就可以使用它。它看起来像这样:

@RunWith(PowerMockRunner.class)
@PrepareForTest({XmlToCsv.class, DocumentBuilderFactory.class})
public class XmlToCsvTest {

    XmlToCsv sut;

    @Test
    public void testXmlToCsv() throws Exception {
        DocumentBuilder documentBuilder = Mockito.mock(DocumentBuilder.class);
        Document document = Mockito.mock(Document.class);

        //when phase
        PowerMockito.mockStatic(DocumentBuilderFactory.newInstance).thenReturn(documentBuilder);
        Mockito.when(factory.newDocumentBuilder).thenReturn(documentBuilder);
        Mockito.when(documentBuilder.parse(any(File.class)).thenReturn(document);

        // now call the class
        sut.xmlToCsv("", "", "");

        //now verify

verify(documentBuilder, times(1)).parse(any(File.class));
    }
}

如您所见,示例还不完整,但有所不同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Junit和Mockito使用Spring存储库测试void方法

测试void方法的行为junit和mockito

如何使用Junit和Mockito测试DaoImpl方法

如何使用junit和mockito测试springjdbcTemplate

如何使用JUnit或Mockito测试匿名方法?

如何使用Mockito和Junit模拟静态方法中存在的void方法调用?

使用JUnit和Mockito测试方法结果的最佳方法

如何使用JUnit或Mockito测试使用无参数和返回值的Random()方法

我应该如何用JUNIT和Mockito测试此方法

如何使用Mockito和JUnit在Spring Boot中测试DELETE方法

如何使用Junit和Mockito测试Spring验证器

如何使用JUnit和Mockito测试自定义JsonSerializer

如何使用Junit和Mockito测试Sum Double值?

如何使用JUnit和Mockito测试我的JwtAuthentication类?

如何使用 mockito 和 junit 测试此功能?

如何使用 Scanner 和 while 循环对 void 方法进行 JUnit 测试

如何使用Mockito在Presenter中测试void方法?

如何使用Mockito在Service类中测试void方法?

在Java中,如何使用断言测试在JUnit无效的Mockito的方法?

在JUnit中使用void方法的Mockito

如何在JUnit测试中使用Mockito?

使用 mockito 和 Junit5 使用参数模拟静态 void 方法

JUNIT测试void方法

使用 Junit 和 Mockito 的 Rest API 的 Junit 测试用例

使用void的JUnit测试

如何使用Mockito使用私有方法调用测试void方法

如何测试休息控制器,静态util的使用JUnit和调用的Mockito

关于如何在JUnit和Spring中测试void返回方法的最佳实践?

如何使用 Mockito 和 Junit 模拟 ZonedDateTime