【问题标题】:NullPointer Exception everytime I try to run my Junit Test Case每次我尝试运行我的 Junit 测试用例时都会出现 NullPointer 异常
【发布时间】:2015-01-07 09:37:28
【问题描述】:

每次我尝试运行 junit 测试用例时,我都会得到空指针异常,并且当我每次函数返回 NULL 值时都尝试处理异常时。这是代码。

RestaurantRepository.java

package org.springsource.restbucks;

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;


@Component
@Transactional
public interface RestaurantRepository extends PagingAndSortingRepository<Restaurant, Long> {
    @Query("SELECT p FROM Restaurant p Where (p.id)=(:Id) and p.deleted=false")
    Restaurant findById(@Param("Id") long Id);

    @Query("SELECT p FROM Restaurant p Where LOWER(p.name)=LOWER(:name) and p.deleted = false")
    Restaurant findByName(@Param("name") String name);
}

RestaurantController.java

@RestController
public class RestaurantController {
@Autowired
    RestaurantRepository repository;
@RequestMapping(value = "/restaurants/{id}", method = RequestMethod.GET, produces = {MediaType.APPLICATION_JSON_VALUE})
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public ResponseEntity<Restaurant> getRestaurant(@PathVariable("id") long restaurantId) {
        Restaurant responseRestaurant = repository.findOne(restaurantId);
        if(responseRestaurant==null){
            logger.error("No Restaurant found with id:"+restaurantId);
            return new ResponseEntity<Restaurant>(HttpStatus.NOT_FOUND);
        }else if(responseRestaurant.isDeleted()==true){
            logger.error("Restaurant Object is deleted");
            return new ResponseEntity<Restaurant>(HttpStatus.NOT_FOUND);
        }else{
            return new ResponseEntity<Restaurant>(responseRestaurant,HttpStatus.OK);
        }
    }

}

RestaurantRepositoryTest.java

import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

public class RestaurantRepositoryTest{

    @Autowired
    private RestaurantRepository repository;    

    @Test
    public void testfindById() throws Exception{ //testing findbyid method in restaurant repository

        Restaurant responseRestaurant = repository.findByName("xyz");   //getting error over here   
        assertEquals("xyz",responseRestaurant.getName());           
    }   
}

每当我运行 mvn test 时,都会出现空指针异常。堆栈跟踪低于我在终端中显示的内容。

  • testfindById(org.springsource.restbucks.RestaurantRepositoryTest) 经过时间:0.018 秒

  • org.springsource.restbucks.RestaurantRepositoryTest.testfindById(RestaurantRepositoryTest.java:19)

我应该怎么做才能成功运行我的测试??

【问题讨论】:

    标签: spring junit nullpointerexception


    【解决方案1】:

    您将其作为没有 Spring 上下文的纯单元测试运行。因此,存储库不会自动装配。您应该能够通过在测试类的顶部添加一些注释来解决此问题。

    如果使用 Spring Boot,那么应该像下面这样工作,让 Spring Boot 完成所有艰苦的工作:

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = MyApplication.class)
    

    您也可以加载 Spring @Configuration 类来初始化您的存储库(在我的例子中,这称为 DbConfig),如下所示:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = { DbConfig.class }, 
                          loader = AnnotationConfigContextLoader.class)
    

    【讨论】:

    • 这是一个不错的解决方案,但它的单元测试不应该依赖于应用程序上下文;它应该单独测试控制器。注入模拟存储库是这里的方法。
    • 我试过你的方法,NULLPOINTER异常错误现在消失了......!!现在我必须想办法解决这个 BEAN 异常!
    • 提示 - 从 RestaurantRepository 中删除 @Component@Transactional 注释。 findById 方法也应该采用 Long arg,而不是 long
    • 如果您使用它来测试存储库,那么您就是在进行集成测试。这些都需要完成,但之后进行了独立的单元测试。 (并且仅适用于自定义方法;尽可能信任 Spring Data 比重新发明轮子更可取。)
    • SpringApplicationConfiguration 是“从 1.4 开始不推荐使用,有利于 SpringBootTest 或直接使用 SpringBootContextLoader”。 “[SpringBootTest] 的搜索算法从包含测试的包开始工作,直到找到一个 \@SpringBootApplication 或 \@SpringBootConfiguration 注释类。只要您以合理的方式构建代码,通常会找到您的主要配置。” docs.spring.io/spring-boot/docs/current/reference/html/…
    【解决方案2】:

    您的测试根本没有启动 Spring 上下文,因此注释被完全忽略。最好的解决方案是修改控制器类以将存储库作为构造函数参数,而不是使用字段注入。这允许您传入一个简单的模拟,例如 Mockito 模拟,并避免启动 Spring 上下文以运行单元测试的复杂性。

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 2023-01-16
      • 2013-11-22
      相关资源
      最近更新 更多