Мне нужно написать тест PartitionMapperTest
для моего класса Java PartitionMapper
. Этот класс имеет частные поля с аннотациями @Inject
, но у него есть только конструктор no-param.Ввод частных полей с @Inject во время теста?
Для теста я хочу создать partitionMapper
перед любым тестом и ввести значения в его частные поля. Затем тестер проверяет метод mapper mapPartitions
и утверждает значения. Однако я не знаю, как вводить эти значения в partitionMapper
.
PartitionMapper.java
@Named
public class PartitionMapper implements javax.batch.api.partition.PartitionMapper {
@Inject
private JobContext jobContext;
@Inject
@BatchProperty
private String fetchSize;
@Inject
@BatchProperty
private String rowsPerPartition;
// other batch properties ...
@PersistenceUnit(unitName = "h2")
private EntityManagerFactory emf;
@Override
public PartitionPlan mapPartitions() throws Exception {
// ...
}
}
PartitionMapperTest.java
public class PartitionMapperTest {
private PartitionMapper partitionMapper;
@Before
public void setUp() {
// Prepare JobContext, batch properties to inject ...
// Instantiation
partitionMapper = new PartitionMapper();
// TODO How to inject these objects into partitionMapper?
}
@Test
public void testMapPartitions() throws Exception {
PartitionPlan partitionPlan = partitionMapper.mapPartitions();
for (Properties p : partitionPlan.getPartitionProperties()) {
// Assertions here ...
}
}
// ...
}
Я на самом деле осуществить реальную PartitionMapperTest
основанную на Mockito и PowerMock, который можно увидеть на моем GitHub. Проблема в том, что существует так много предположений, что это приводит к очень плохому коду для понимания пользователями. Я ищу другое решение для его рефакторинга.
Вы Ответом является хорошей идеей. Вероятно, я его выберу. Однако мне интересно узнать, как CDI вводит значения в частные поля? Я имею в виду, что нет сеттеров, как они это достигают? Если я применил тот же механизм, могу ли я добиться тоже? (Внедрить их самостоятельно) –
Я хочу иметь только конструктор без аргументов, потому что я не хочу, чтобы кто-нибудь создавал этот внутренний класс в API. Но они все равно могут сделать это на самом деле:/ –
Полевые инжекционные пути требуют отражения, насколько я знаю. Я предполагаю, что это делается следующим образом: 'Поле поля = Example.class.getDeclaredField (" fieldName "); field.setAccessible (истина); field.set (instance, value); '. Если вы хотите заставить свой класс использовать только внутренне, вы можете сделать свой пакет конструктора приватным. Это не 100% -ное решение, но лучше, чем ничего. Если вы это сделаете, убедитесь, что ваш тест находится в одном пакете ...;) –