这是我要测试的功能:
@Component
public class DataSourceAttributes {
...
...
public AWSSecretDB getAttribsBySecret() throws Exception {
AbstractConnector abstractConnector = new AWSSecretManagerConnector("secretsmanager." + region + ".amazonaws.com", region);
GenericManager genericManager = new GenericManager(abstractConnector);
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;
}
}
这是我当前的单元测试:
public class DataSourceAttributesTest {
@InjectMocks
private DataSourceAttributes dataSourceAttributes;
@Mock
private GenericManager genericManagerMock;
@Test
public void AWSSecretDBGetAttribsBySecret() throws Exception {
AWSSecretDB awsSecretDB = new AWSSecretDB();
awsSecretDB.setEngine("Engine Test");
awsSecretDB.setDbname("DB Test");
awsSecretDB.setHost("Host Test");
when(genericManagerMock.getSecretModel(ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(awsSecretDB);
dataSourceAttributes.getAttribsBySecret();
// The assert is missing, but it's not important for this question
}
}
我需要模拟genericManager来控制getSecretModel()函数,但它不起作用。
当我运行我的测试时,System.out.println(位于 getAttribsBySecret 中)打印出以下消息,证明模拟不起作用:
Generic Manager: co.com.bancolombia.commons.secretsmanager.manager.GenericManager@1349883
我知道如果我使用以下代码,模拟效果很好,但我不想重新编码它已经在 src 目录中工作的东西:
当我运行测试时,System.out.println(位于 getAttribsBySecret 中)打印:
GENERIC MANAGER: genericManagerMock
awsSecretDB: Engine Test
它如何显示,模拟效果很好。所以,这是我的问题:如何在类中使用模拟并避免在主代码中声明新属性和构造函数。我问这个是因为第一个代码有效,我不想编辑它,我认为这不是单元测试的精髓。
动漫人物
慕盖茨4494581
相关分类