gpt4 book ai didi

java - 单元测试的依赖注入(inject)与管理自己变量的类

转载 作者:行者123 更新时间:2023-12-01 11:21:54 24 4
gpt4 key购买 nike

我有一个类似这样的类(非常简化,但这是总体思路。我实际上并没有使用原始套接字类型):

class ConnectionBroker {

private Socket socket;

public ConnectionBroker(ConnectionDetails details) {
socket = new Socket(details)
//set socket paramaters
}

public sendOverConnection(String message) {
//processing of message and internal queuing based on priority
socket.send(message);
}

public shutdown() {
socket.close();
}
}

如果我可以通过模拟套接字变量来检查通过套接字发送的内容来对类的函数进行单元测试,那将是很有值(value)的。我见过的执行此操作的标准方法是将构造函数修改为

public ConnectionBroker(Socket socket) {
this.socket = socket;
}

这将使单元测试变得更加容易,但是我这样做有很多问题:

  • 套接字只能由 ConnectionBroker 类管理
  • ConnectionBroker 类完全使用套接字这一事实应该从调用类中抽象出来
  • 如果需要传入套接字,则调用代码可能会修改 ConnectionBroker 类不知道的套接字上的属性

解决这个问题的正确方法是什么?我是不是想错了什么?

最佳答案

不确定ConnectionBroker(Socket socket)是否是标准方式,正如您指出的那样,它有其优点和缺点。

显然,代码中存在问题的部分是对 new Socket(details) 的调用,这会阻碍测试。

在几乎类似的场景中,我引入了一个新的依赖项SocketProvider,其中包含一个方法getSocket(),最终创建了套接字:

公共(public)套接字 getSocket() {
返回新的套接字();

这使得单元测试提供返回模拟/ stub / spy 的实现或子类变得微不足道......例如

@Mock 
private Socket mockedSocket;
@Mock
private SocketProvider mockedProvider;

// ...
conncectionBroker.setSocketProvider(mockedProvider);

// ...

when(mockedProvider.getSocket()).return(mockedSocket); // or a stub / spy / testSocket...

它还允许为不同的环境和测试场景提供不同的实现 - IMO 使其成为您建议的更好的方法(其中创建逻辑位于单个测试的责任范围内)。

关于java - 单元测试的依赖注入(inject)与管理自己变量的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31126585/

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