私はテストのためにSpringブートとMockitoを使用しています。私はサービス層のテストケースを書くことができ、うまく動作しています。しかし、DAO層のテストケースはそうではありません。テストケースの実行時にjdbcTempolateオブジェクトがmockedされ、autowiredによってnullポインタが返されます。以下は、詳細は以下のとおりです。SpringブートでjdbcTemplateをモックできません。テストクラス
マイDAOTestクラス:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = EcommerceApplication.class)
public classEcommerceDaoTest {
@InjectMocks
private IEcommerceDao ecommerceDao = new EcommerceDaoImpl();
@Mock
@Autowired
private JdbcTemplate as400JdbcTemplate;
@Before
public void setUp() throws Exception
{
MockitoAnnotations.initMocks(this);
}
@Test
public void checkOrderExistsTest() throws EcommerceException{
Mockito.when(as400JdbcTemplate.queryForObject(queryForOrder,new Object[]
{"1000"}, int.class)).thenReturn(1);
boolean exists =
ecommerceDao.checkOrderExists("1000");
assertTrue(exists);
}
}
EcommerceDAOImpl.java:
@Override
public boolean checkOrderExists(String orderNo)throws EcommerceException{
boolean doesExist = false;
int count = 0;
try{
count= as400JdbcTemplate.queryForObject(queryForOrder, new Object[]{orderNo}, int.class);
if(count >0){
doesExist = true;
}
}
catch(Exception e){
}
return doesExist;
}
AS400Config.java:
@Bean
@Autowired
public JdbcTemplate as400JdbcTemplate(@Qualifier("as400DataSource")DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
ECommerceApplication.java
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class,
HibernateJpaAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class })
@EnableTransactionManagement
@Import(As400Configuration.class)
public class EcommerceApplication {
public static void main(String[] args) {
SpringApplication.run(EcommerceApplication.class, args);
}
}
私がテストケースを実行しているとき、as400JdbcTemplateのNullポインター例外が発生しています。機能は正常に動作します。 jdbctemplateがmocked/autowiredにならないために失敗したDAO層のテストケースです。
私が間違っている場所を教えてください。
はありがとうございました。今働いている。私はMockitoJUnitRunner.classを追加しました。しかし、私はここで追加のクエリを持っています。私のDAOのメソッドの1つは、DAOImplと同じjavaファイルにあるRowMapperクラス(オブジェクト内に結果セットデータを設定するため)を使用することです。したがって、publicクラスはdaoimplであり、RowMapperを実装している他のクラスも同じファイル内にあります(内部クラスではありません)。だから、私がこのメソッドをテストしているとき、失敗しています。 –
私は以下を使用しています: 'Mockito.when(as400JdbcTemplate.query(queryForShipment、new Object [] {" 1000 "}、新しいShipmentRowMapper()))then return(更新);そしてmain daoメソッドでは:' list = as400JdbcTemplate .query(queryForShipment、new Object [] {orderNo}、new ShipmentRowMapper()); 'テスト時にリストはnullです。 –
私はコードを以下のように変更しました:list = as400JdbcTemplate.query(queryForShipment、new Object [] {orderNo}、newShipmentRowMapper()); shipmentRowMapper = new ShipmentRowMapper();)とクラスレベルで定義されています。 –