junit测试中的NullpointException

时间:2017-09-24 09:09:47

标签: java spring junit

在我的java spring mvc应用程序中,我在junit测试中遇到NullPointerException,所有类都位于某个包中,我在setLayerType(View.LAYER_TYPE_SOFTWARE, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.OVERLAY)); 方法

中按照下面的方式解决了这些问题。
main

然后在@SpringBootApplication @ComponentScan({ "com.example.model" }) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } 我有以下类,接口:

com.example.model

实施如下:

public interface DataService {

    int[] retrieveAllData();

}

然后我在另一个类中使用了以下服务:

@Service
public class DataServiceImpl implements DataService {

    @Override
    public int[] retrieveAllData() {

        return new int[] { 1, 2, 3, 4 };
    }
}

我写了一个测试来检查public class SomeBussiness { @Autowired DataServiceImpl dataService; public int findTheGreat() { int[] res = dataService.retrieveAllData(); return res[0]; } } 类中的findTheGreattest()

SomeBussiness

但它在{/ 1>}行中抱怨

public class SomeBussinessTest {

    @Test
    public void findTheGreatTest() {
        SomeBussiness sbi = new SomeBussiness();
        int res = sbi.findTheGreatest();
        assertEquals(1, res);
    }
}

但是,我使用NullPointExceptionint[] res = dataService.retrieveAllData(); 注入了@Service

我该如何解决?

更新

我添加了@Autowiered dataService类:

@Service

然后添加更改测试,如下所示:

SomeBussiness

现在它抱怨:

@Service
public class SomeBussiness {

    @Autowired
    DataServiceImpl dataService;

    public int findTheGreat() {
        int[] res = dataService.retrieveAllData();
        return res[0];

    }
}

2 个答案:

答案 0 :(得分:0)

您的班级中的自动装配永远不会被触发。首先,您需要一个初始化所有测试类的JUnit运行器。此外,您必须通过此跑步者创建受测试的课程,而不是通过调用' new'来创建它:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {DemoApplication.class})
public class SomeBussinessTest {

    @Autowired
    SomeBussiness sbi;

    @Test
    public void findTheGreatTest() {
        int res = sbi.findTheGreatest();
        assertEquals(1, res);
    }
}

答案 1 :(得分:0)

因为新关键字。当你使用new创建一个实例时,不会发生spring的依赖注入,你必须确保通过构造函数或setter传递依赖项。

   @Test
    public void findTheGreatTest() {
        SomeBussiness sbi = new SomeBussiness();
        sbi.setDataService(dbService);
        int res = sbi.findTheGreatest();
        assertEquals(1, res);
    }

使用SpringRunner

@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class SomeBussinessTest {

    @Autowired
    SomeBussiness sbi;

    @Test
    public void findTheGreatestTest() {
        assertEquals(1, sbi.findTheGreatest());

    }
}

这篇文章清楚地解释了新关键字的作用:

Role of new keyword in Spring Framework