当前位置: 首页 > 知识库问答 >
问题:

无法在Spring Boot测试类中模拟jdbcTemplate

戚阳
2023-03-14

我正在使用Spring boot和Mockito进行测试。我已经能够为服务层编写测试用例,它们工作得很好。但是,针对DAO层的测试用例却没有。在执行测试用例时,被mocked和autowired的jdbctemplate对象提供null指针。以下是详细情况:

我的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);
}
}

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;
}
    @Bean
    @Autowired
    public JdbcTemplate as400JdbcTemplate(@Qualifier("as400DataSource")DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
@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);
}
}

共有1个答案

郁博学
2023-03-14

>

  • 不需要同时使用@mock@autowired。仅使用@mock:

    @mock private JdbcTemplate as400jdbctemplate;

    使用代替@runwith(Springrunner.class)-->@runwith(MockitoJunitrunner.class)

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

  •  类似资料:
    • 问题内容: 我有一个Spring 3.2 MVC应用程序,并且正在使用Spring MVC测试框架来测试控制器操作上的GET和POST请求。我正在使用Mockito模拟服务,但是发现模拟被忽略并且正在使用我的实际服务层(因此,数据库被命中)。 我的Controller测试中的代码: 你会注意到我有两个上下文配置文件;这是一个黑客,因为如果我无法阻止控制器测试到达实际的服务层,则该服务层也可能会将其

    • 我正在编写单元测试的方法,以找到银行附近我的位置。我嘲弄了这个类并尝试调用这些方法。但是,控件不会转到方法来执行它。下面是单元测试用例。 我所尝试的也是调用它的真实方法, 这调用真实的方法,但我上面嘲笑的方法执行起来就像真实的方法一样。意思是“被嘲弄的方法”没有返回我要求它们返回的内容。 那么,我在这里做错了什么?方法为什么不执行?

    • 在我的代码中,我有时在同一个类中调用public或private方法。这些方法并不是一个很好的候选方法,不适合被拉入自己的类中。我调用的每个方法都在它们自己的单元测试中进行测试。 那么,如果我的类a中有一个方法也在类a中调用这些方法中的每一个,有没有办法模拟这些调用?我当然可以剪切和粘贴我的期望/模拟行为,但这不仅是一件乏味的事情,它混淆了测试的要点,违反了模块化,并且由于无法控制返回的内容,使测

    • 在我的代码中,我有时在同一个类中调用公共或私有方法。这些方法不适合被拉到自己的类中。我调用的这些方法中的每一个都是在它们自己的单元测试中进行测试的。 那么,如果我的类a中有一个方法,它也调用类a中的每个方法,那么有什么方法可以模拟这些调用吗?我当然可以剪切和粘贴我的期望/模拟行为,但这不仅是乏味的,它混淆了测试的重点,违反了模块化,并且由于无法控制返回的内容而使测试更加困难。 如果不是,这种事情通

    • 我有一个Spring 3.2 MVC应用程序,正在使用Spring MVC测试框架测试控制器动作的GET和POST请求。我使用Mockito来模拟服务,但我发现模拟被忽略了,我的实际服务层被使用了(因此,数据库被击中)。 控制器测试中的代码: 你会注意到我有两个上下文配置文件;这是一种黑客行为,因为如果我无法阻止控制器测试命中实际的服务层,那么该服务层的存储库也可能指向测试数据库。我再也不能忍受这

    • 问题内容: 我在源代码中使用了BufferedWriter对象 我正在尝试在我的测试用例中模拟它,如下所示: 但是,BufferedWriter不会被嘲笑,它总是进入实际的实现中。是因为它不能模拟BufferedWriter,因为它是一个具体的类吗?这是否意味着无法模拟任何java.io类?有没有办法模拟它,或者我做错了什么? 问题答案: ,你可以嘲笑的Java IO类(包括它们的构造,所以未来的