junit4启动测试时发生java.lang.NullPointerException的错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了junit4启动测试时发生java.lang.NullPointerException的错误相关的知识,希望对你有一定的参考价值。

实例类: package com.mypackage.junittest; public class Calculator private static int result; // 静态变量,用于存储运行结果 public void add(int n) result = result + n; public void substract(int n) result = result - 1; // Bug: 正确的应该是 result =result-n public void multiply(int n) // 此方法尚未写好 public void divide(int n) result = result / n; public void square(int n) result = n * n; public void squareRoot(int n) for (;;) ; // Bug : 死循环 public void clear() // 将结果清零 result = 0; public int getResult() return result; ================================================== 测试类: package com.mypackage.junittest; import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; public class CalculatorTest private static Calculator calculator = new Calculator(); @Before public void setUp() throws Exception calculator.clear(); @Test public void testAdd() calculator.add(2); calculator.add(3); assertEquals(5, calculator.getResult()); @Test public void testSubstract() calculator.add(10); calculator.substract(2); assertEquals(8, calculator.getResult()); @Test public void testDivide() calculator.add(8); calculator.divide(2); assertEquals(4, calculator.getResult());

参考技术A 排查问题
  1,查看各位引用,Appium,selenium,junit的包都包含了,在Build
path里面设置正确,此处没有问题。
  2,APK的各种情况,版本安装是否正确,要测试的和提供的APK的版本是否一致。经查看,是一致的,此处Pass!
  3,Capabilities各种参数的设置,对比了网上提供的实例和我以前用Python写的,运行成功的测试用例的设置,发现完全一致,也没有任何问题。
  4,现在只好查看一下Eclipse的问题了,查看WorkSpace下的.metadata文件夹下的.log文件,看一下是否存在问题。
  经查看,发现有org.eclipse.jdt.junit相关的错误,于是我就在Eclipse下查找这个jdt.junit相关的插件,发现没有找到,现在问题就定位到了,肯定是这个插件出问题了!!
  解决问题
  问题描述:Eclipse下缺少org.eclipse.jdt.junit相关的插件,造成用junit运行测试用例的时候,报空指针的错误!!!
  网上查看了一下JDT相关的东西,发现中能是我这个Eclipse下载的是ADT版本的,当时用来做Appium
python版和Robotium的测试的。这个版本的Eclipse没有SDK。于是去网上下载了一个eclipse-jee-luna-SR1-win32-x86_64,解压后,再按Appium
java环境搭建的方法配置了一下,写了个Demo再次运行,成功!!
顺便,android提供的的eclipes无法使用junit4,也需要重新下载。望采纳。

Spring Hibernate H2 Junit 测试 - 如何在启动时加载模式

【中文标题】Spring Hibernate H2 Junit 测试 - 如何在启动时加载模式【英文标题】:Spring Hibernate H2 Junit testing - how to load schema on start 【发布时间】:2016-07-25 12:59:56 【问题描述】:

我正在尝试为我的应用程序开发测试(我很晚才发现这些测试......)但我被卡住了,基本配置也被卡住了。我用谷歌搜索了很多例子,但没有一个让我满意,坦率地说让我有点困惑。

我想要实现的是在测试开始时加载 import.sql(这是现有 MySQL 模式的转储文件)并将其加载到 H2 数据库中。

这里是休眠配置文件:

@Configuration
@EnableTransactionManagement
@ComponentScan( "kamienica.feature" )
public class HibernateTestConfiguration 

    @Autowired
    ApplicationContext applicationContext;

    @Bean
    public LocalSessionFactoryBean sessionFactory() 
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(new String[]  "kamienica" );
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    

    @Bean(name = "dataSource")
    public DataSource dataSource() 
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.h2.Driver");
        dataSource.setUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;"
                + "INIT=CREATE SCHEMA IF NOT EXISTS kamienica;DB_CLOSE_ON_EXIT=FALSE");
        dataSource.setUsername("sa");
        dataSource.setPassword("");

        return dataSource;
    

    private Properties hibernateProperties() 
        Properties properties = new Properties();
        properties.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
        properties.put("hibernate.hbm2ddl.auto", "update");
// this is where I tried to load script the first time:
// properties.put("hibernate.hbm2ddl.import_files", "kamienica.sql");
        return properties;
    

    @Bean
    @Autowired
    public HibernateTransactionManager transactionManager(SessionFactory s) 
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(s);
        return txManager;
    

每次我开始测试时都会收到一条消息:

org.hibernate.tool.hbm2ddl.DatabaseMetadata getTableMetadata 信息: HHH000262:找不到表:公寓

我在尝试检索任何内容时得到空/空值

我尝试在休眠配置(通过休眠属性)以及计划扩展的所有测试类的超类中加载 sql 文件:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes =  HibernateTestConfiguration.class )
public class BaseTest 

    private EmbeddedDatabase db;

    @Autowired
    private SessionFactory sessionFactory;

    //second attempt to load sql file
    @Before
    public void setUp() throws Exception 
        db = new EmbeddedDatabaseBuilder().addScript("import.sql").build();
    

    @After
    public void tearDown() throws Exception 
        SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
        SessionFactoryUtils.closeSession(sessionHolder.getSession());
    


如何加载 sql 文件并准备 H2 数据库以执行测试?

【问题讨论】:

我不知道这对你来说是不是有点过头了,但是在 CI/CD 的情况下,你会使用 Flyway 之类的东西来为你管理你的数据库模式,并且非常乐意构建它用于测试数据库。 【参考方案1】:

我希望这个 Spring Boot 方法对您有所帮助。首先在项目根目录下的 src/test 目录下创建一个resources目录(springboot的类路径)。 在此目录中,您将开始放置名为 data.sql 的夹具 SQL 数据文件。 然后,在同一级别创建一个 application.properties 文件(同一目录见截图)。该文件应如下所示填充:

spring.datasource.url = jdbc:h2:~/test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
#spring.datasource.url: jdbc:mysql://localhost:3306/yourDB
#spring.datasource.username = root
#spring.datasource.password =

# Hibernate
hibernate.show_sql: true
#hibernate.dialect: org.hibernate.dialect.MySQL5Dialec
spring.jpa.hibernate.ddl-auto=none

截图:

现在你的测试方法。

@RunWith(SpringJUnit4ClassRunner.class) 
....
            @Autowired
            private DataSource ds; //your application.properties
            @Autowired
            private WebApplicationContext context;
            private static boolean loadDataFixtures = true;
            private MockMvc mockMvc;
        ....

         @Before
         public void setupMockMvc() 
         mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
        




        @Before
            public void loadDataFixtures() 
                 if (loadDataFixtures) 
                    ResourceDatabasePopulator populator = new ResourceDatabasePopulator(context.getResource("classpath:/data.sql"));
                    DatabasePopulatorUtils.execute(populator, ds);
                    loadDataFixtures = false;
                
            

@Test
public void yourmethod() 
    assertEquals(3, repository.count()); //example

【讨论】:

【参考方案2】:

没有任何输出或完整的堆栈跟踪,我唯一可以建议您的是:

    您没有显示任何@Test 方法。你是怎么得到这个错误的? 您的文件import.sqlsrc/test/resources 文件夹中吗? (注意测试路径) 您的 sql 脚本格式是否正确?您是否尝试过在导出后运行?您能否发布创建 apartment 表的 sql 脚本部分?

如果一切都是真的,也许问题不在于加载sql,而在于它是如何使用的,或者脚本的内容,或者表的名称等等......

【讨论】:

【参考方案3】:

经过长时间的“调查”,我得出的结论是问题隐藏在 DBUnit、TestNG 设置中的某个地方。

我决定保持简单并切换到 JUnit 测试。

如果其他人可能有类似的问题,这里是适合我的配置文件:

@Configuration
@EnableTransactionManagement
@ComponentScan( "kamienica.feature" )
public class JUnitConfig 

    @Bean
    public LocalSessionFactoryBean sessionFactory() 
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(new String[]  "kamienica" );
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    

    @Bean(name = "dataSource")
    public DataSource dataSource() 
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.h2.Driver");
        dataSource.setUrl("jdbc:h2:mem:kamienica;MODE=MySQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");

        dataSource.setUsername("sa");
        dataSource.setPassword("");
        return dataSource;
    

    private Properties hibernateProperties() 
        Properties properties = new Properties();
        properties.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
        properties.put("hibernate.hbm2ddl.auto", "create");
        return properties;
    

    @Bean
    public HibernateTransactionManager transactionManager(SessionFactory s) 
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(s);
        return txManager;
    


现在只需要在资源文件夹中插入 import.sql 文件。 我还发现每条insert语句不管多长都必须在一行,否则加载不出来。

最后是一个简单的测试类:

@ContextConfiguration(classes =  JUnitConfig.class )
@RunWith(SpringJUnit4ClassRunner.class)
public class ApartmentServiceTest extends AbstractServiceTest

    @Autowired
    ApartmentService service;


    @Test
    public void getList() 
        List<Apartment> list = service.getList();
        System.out.println(list.toString());
        assertEquals(5, list.size());
    

【讨论】:

以上是关于junit4启动测试时发生java.lang.NullPointerException的错误的主要内容,如果未能解决你的问题,请参考以下文章

未找到测试运行程序“JUnit 4”的测试

Spring整合JUnit4测试时,使用注解引入多个配置文件

Scala使用JUnit4单元测试

Java单元测试工具:JUnit4

五年了,你还在用junit4吗?

关于测试:JUnit4课程