Это функция, которую я хочу проверить:
@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 , чтобыcontrol getSecretModel () функция, но она не работает.
Когда я запускаю свой тест, System.out.println (расположенный в getAttribsBySecret) печатает следующее сообщение, подтверждающее, что макет не работает:
Generic Manager: co.com.bancolombia.commons.secretsmanager.manager.GenericManager@1349883
Я знаю, использую ли я следующеекод, макет прекрасно работает, но я не хочу перекодировать то, что уже работает в каталоге src:
@Component
public class DataSourceAttributes {
private GenericManager genericManager; // First change
public DataSourceAttributes () { // Second cahnge
AbstractConnector abstractConnector = new AWSSecretManagerConnector("secretsmanager." + region + ".amazonaws.com", region);
this.genericManager = new GenericManager(abstractConnector);
}
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());
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
throw e;
}
return awsSecretDB;
}
}
Когда я запускаю свой тест, System.out.println (находится в getAttribsBySecret) печатает:
GENERIC MANAGER: genericManagerMock
awsSecretDB: Engine Test
Как это видно, макет прекрасно работает.Итак, это мой вопрос: как я могу использовать макет внутри класса и избежать объявления нового атрибута и конструктора в основном коде.Я спрашиваю об этом, потому что первый код работает, и я не хочу его редактировать, я думаю, что это не философия модульных тестов.
Спасибо!