gpt4 book ai didi

java - DI 的部分模拟?

转载 作者:太空宇宙 更新时间:2023-11-04 07:38:22 25 4
gpt4 key购买 nike

对于我的上一个 Java 项目,我对所有类进行了单元测试。每个类都有它自己的接口(interface)和实现(即Person 和PersonImpl)。类仅通过接口(interface)相互交互,我使用模拟来独立于其他类测试每个类。它最终真的很痛苦,因为它破坏了我的 eclipse ctrl+click 导航,因为每个方法调用都是在接口(interface)上调用的。每次我创建一个对象时,当该对象完全可以创建其依赖项(除了测试之外)时,它还使业务代码变得有点困惑,因为每次我创建一个对象时都必须创建并传递依赖项工厂。我偶然发现了另一种形式的依赖注入(inject),它似乎可以为我解决这两个问题,我想知道是否有人可以告诉我为什么这不是一个好主意。

这是一个简单的、人为的、不切实际的示例...假设 File 和 FileFactory 是接口(interface)。

基于接口(interface)的构造函数 DI

public class Logger {

private File file;

public Logger(FileFactory fileFactory, String fileName) {
file = fileFactory.create(fileName);
file.createNewFile();
}

public void debug(String message) {
file.append("[debug] " + message);
}

public void error(String message) {
file.append("[error] " + message);
}
}

部分模拟依赖注入(inject)

public class Logger {

private File file;

public Logger(String fileName) {
file = createFile(fileName);
file.createNewFile();
}

public void debug(String message) {
file.append("[debug] " + message);
}

public void error(String message) {
file.append("[error] " + message);
}

public File createFile(String fileName) {
return new File(fileName);
}
}

在第二个示例中,没有接口(interface)或工厂,并且保留了类之间的关系,因此我可以按住 Ctrl 键并单击“createNewFile()”或“append”。在编写测试时,我可以使用 Mockito 对此类进行部分模拟,并指示它返回“createFile(String)”的模拟文件,因此我仍然可以在测试期间注入(inject)依赖项。我看到这样做的好处。有什么我没有看到的缺点吗?

最佳答案

我不太喜欢 java,但我知道 C# 中的 DI,所以我想我可以提供一些帮助。

首先,请阅读本文 stackoverflow question 。我已经问过要测试什么以及为什么要进行模拟。希望这个问题能够给出进行单元测试的总体思路。

对我来说,应该在模拟对象中做什么:

  1. 简单

    简单的模拟对象可以使您的测试单元更易于审查。简单的模拟对象可以使其变得微不足道,并且不需要对模拟对象进行任何测试。一个简单的模拟对象将支持下面的第 4 点。

  2. 具有最小的依赖性

    就您而言,您对 FileFactory 的依赖较少。这很好,因为设置测试更容易。具有最小依赖性的另一个好处是它具有最小的测试范围。它还支持下面的第 4 点。

  3. 没有界面所具有的附加功能

    在您的示例中,您有另一个函数 public File createFile。我想知道它是否会被消费者使用(它是公共(public)的)。恕我直言,最好将其设为私有(private),以确保单元测试不会调用附加方法。

  4. 当测试类改变时不会破坏测试类

    mock对象最重要的一点是当测试类(消费者)改变时,mock对象不会引起错误。因为您想要对测试类进行单元测试,所以任何错误都应该只由被测试的类引起。当错误是由模拟对象引起时,将更难以跟踪。

关于java - DI 的部分模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16451954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com