2017-06-30 21 views
1

私はテストのために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層のテストケースです。

私が間違っている場所を教えてください。

答えて

0
  1. あなただけ

    @Mock プライベートJdbcTemplate as400JdbcTemplateを@Mock同じtime.useで使用@Mockと@Autowiredは必要ありません。

  2. 使用代わりに@RunWith(SpringRunner.class) - > @RunWith(MockitoJUnitRunner.class)は、ばね試験からReflectionTestUtilsを使用することができ、DAOにモックを注入する

aslo。

公共の静的な無効setField(クラスtargetClass、文字列名、オブジェクト値)

@Before 
public void setUp() throws Exception { 
    MockitoAnnotations.initMocks(this); 
    ReflectionTestUtils.setField(ecommerceDao ,"as400JdbcTemplate" , 
     as400JdbcTemplate); 

} 
+0

はありがとうございました。今働いている。私はMockitoJUnitRunner.classを追加しました。しかし、私はここで追加のクエリを持っています。私のDAOのメソッドの1つは、DAOImplと同じjavaファイルにあるRowMapperクラス(オブジェクト内に結果セットデータを設定するため)を使用することです。したがって、publicクラスはdaoimplであり、RowMapperを実装している他のクラスも同じファイル内にあります(内部クラスではありません)。だから、私がこのメソッドをテストしているとき、失敗しています。 –

+0

私は以下を使用しています: 'Mockito.when(as400JdbcTemplate.query(queryForShipment、new Object [] {" 1000 "}、新しいShipmentRowMapper()))then return(更新);そしてmain daoメソッドでは:' list = as400JdbcTemplate .query(queryForShipment、new Object [] {orderNo}、new ShipmentRowMapper()); 'テスト時にリストはnullです。 –

+0

私はコードを以下のように変更しました:list = as400JdbcTemplate.query(queryForShipment、new Object [] {orderNo}、newShipmentRowMapper()); shipmentRowMapper = new ShipmentRowMapper();)とクラスレベルで定義されています。 –

関連する問題