2 回答
TA贡献1815条经验 获得超10个赞
要使用单元测试,您首先需要使代码可测试。这可能需要一些代码更改。无法在方法内部模拟局部变量,因此您需要将这些变量作为参数传递给方法,或者在对象内部创建属性并将模拟对象传递给构造函数。
@Component
public class DataSourceAttributes {
private AbstractConnector abstractConnector;
private GenericManager genericManager;
@Autowired // to ask Spring to inject dependencies
public DataSourceAttributes(AbstractConnector abstractConnector, GenericManager genericManager) {
this.abstractConnector = abstractConnector;
this.genericManager = genericManager;
}
public AWSSecretDB getAttribsBySecret() throws Exception {
System.out.println("Generic Manager: " + genericManager);
AWSSecretDB awsSecretDB;
try {
awsSecretDB = genericManager.getSecretModel(secretName, AWSSecretDB.class);
System.out.println("awsSecretDB: " + awsSecretDB.getEngine()); // It must be mocked
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
throw e;
}
return awsSecretDB;
}
}
然后在测试中创建对象的实例,将模拟依赖项传递给构造函数
TA贡献1850条经验 获得超11个赞
如果您知道代码有效,那么首先为什么要对其进行单元测试?或者,如果您不打算更改源来修复它,为什么要执行可能带来错误的活动?
但是,更严重的是,您似乎陷入了“遗留代码困境”:要修改代码,您宁愿进行适当的测试。要进行测试,您必须修改代码。
对此的逃避是从刚好足以创建您需要的那些测试的微创更改开始。由于这是一种迁移方法,有时甚至可以接受一些肮脏的技巧来克服困境。Michael Feathers 在“有效处理遗留代码”中详细讨论了这一点,并提供了许多实用建议。
在像 Java 这样具有自省功能的语言中,有时自省可以成为一个解决方案,以实现更好的可测试解决方案。然而,这属于肮脏的伎俩,除了作为迁移到更好解决方案的一种方式之外,我认为这是不可取的。
添加回答
举报