私のJavaクラスPartitionMapper
には、PartitionMapperTest
というテストを書く必要があります。このクラスには、@Inject
アノテーションを持つプライベートフィールドがありますが、それにはノンパラメコンストラクタのみがあります。テスト中に@Injectを持つプライベートフィールドを注入しますか?
テストのために、テストの前にpartitionMapper
を作成して、そのプライベートフィールドに値を注入したいと思います。次に、テスターはマッパーのメソッド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 ...
}
}
// ...
}
私は実際に私のGitHubで見ることができMockitoとPowerMockに基づいて実PartitionMapperTest
を実装しました。問題は非常に多くの前提があるため、ユーザーの理解のために非常に貧弱なコードにつながるということです。私はそれをリファクタリングするための別のソリューションを探しています。
あなたは答えは良いアイデアです。私はおそらくそれを選ぶだろう。しかし、私はCDIが値をプライベートフィールドにどのように注入するのか知りたいのですか?つまり、セッターはいないのですが、達成方法は?私が同じ仕組みを適用しても、私は達成することができますか? (自分で注入する) –
私は誰もAPI内でこの内部クラスをインスタンス化しないようにしたいので、引数なしのコンストラクタしか持たないでください。しかし、彼らはまだ実際にそれを行うことができます:/ –
フィールド注入は私が知る限り、反射を必要とします。私はそれが次のように行われると仮定します: 'Field field = Example.class.getDeclaredField(" fieldName "); field.setAccessible(true); field.set(インスタンス、値); 'あなたのクラスが内部的にのみ使用されるようにしたい場合は、コンストラクタパッケージをプライベートにすることができます。それは100%解決策ではありませんが、何もありません。これを行うと、あなたのテストが同じパッケージになっていることを確認してください;) –