dao をテストしようとしていますが、anyString() を渡すと、dao で null 文字列として出力され、その結果、必要なモック化されたオブジェクトが返されません。
@InjectMocks
private Dao dao;
@Mock
@Qualifier("jdbcTemp")
private JdbcTemplate jdbcTemp;
@Test
public void testGetData() {
List<MyObj> list = new ArrayList<>();
MyObj myObj = new MyObj();
myObj.setMethod("method val");
list.add(myobj);
Mockito.when(jdbcTemp.query(anyString(), Mockito.any(PreparedStatementSetter.class),
Mockito.any(Dao.MyRowMapper.class))).thenReturn(list);
List<MyObj> res = dao.getData(param1, param2); // this is empty, instead of having a value of 1
Assertions.assertThat(res).isNotNull();
}
マイダオ
@Autowired
private String query;
@Autowired
private JdbcTemplate jdbcTemp;
public List<MyObj> getData(String arg1, String arg2) {
List<MyObj> list = new ArrayList<MyObj>();
try {
// query below is null instead of empty string
list.addAll(jdbcTemp.query(query, new PreparedStatementSetter() {
public void setValues(PreparedStatement pstmt) throws SQLException {
pstmt.setString(PARAM_ONE, arg1);
pstmt.setString(PARAM_TWO, arg2);
}
}, new MyRowMapper()));
} catch (Exception exp) {
}
return list;
}
anyString マッチャーの代わりに any を使用してみてください。モックがないため、クエリ文字列は null です。
– Sクマール
2020 年 9 月 3 日 18:38
Any も機能しません。ただし、 when でモックとマッチャーを混合することはできません。
– スパイダー
2020 年 9 月 3 日 19:22
any(String.class) ではなく any() を試してみていただければ幸いです。 anyString は null と一致しません。 any(String.class) も null と一致しませんが、any() メソッドは null と一致します。
– Sクマール
2020 年 9 月 3 日 19:40
はい、ny() であり、後者ではありません。この問題を解決するために、h2 テーブルを作成してみます
– スパイダー
2020 年 9 月 3 日 19:52
------------------------
つまり、あなたが正しく述べたように、anyString() は null 以外の文字列にのみ一致します。また、メソッドにクエリを渡すときは、オートワイヤーされたクエリが null でないことを確認する必要があります。
代わりに、null に一致する any() または nullable(String.class) を使用することもできます。テストはクエリ値に依存しないため、これを安全に使用できます。
ただし、コードにはインジェクションがどのように機能するかが示されていないため、問題をさらに調査することはできません。これなら私は必要に応じて、関連するコード部分を追加してください。