使用 DBUnit 配置单一测试时,我的通用 Dao 中出现“java.lang.NullPointerException”错误 [重复]

Posted

技术标签:

【中文标题】使用 DBUnit 配置单一测试时,我的通用 Dao 中出现“java.lang.NullPointerException”错误 [重复]【英文标题】:"java.lang.NullPointerException" error in my generic Dao while configuring unitary testing with DBUnit [duplicate] 【发布时间】:2014-09-23 08:45:52 【问题描述】:

我在以下行中收到“java.lang.NullPointerException”错误:

miIdioma=miDao.find(Idioma.class, "playa");

miIdioma 是属于“Idioma”类的对象,由属性“palabra”和“idioma”组成

Dao 文件名为 IIdiomaDao.java,我想使用它的方法:

public <T> T find(Class<T> clazz, Serializable id) 
        return entityManager.find(clazz, id);
    

为了访问这个方法,我在原始文件中声明了变量 miDao

private IIdiomaDao miDao;

最后,我用这个方法来获取访问权限

miIdioma=miDao.find(Idioma.class, "playa");

我知道当变量未初始化时会显示此错误,但我将数据库连接到我的项目并且应该上传数据库数据。为了执行单一测试,我按照以下步骤操作:

    我连接了数据库

    public class IdiomaDaoTest 
    
      private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
      private static final String JDBC_URL = "jdbc:mysql://localhost:3306/diccionario";
      private static final String USER = "root";
      private static final String PASSWORD = "mypassword";
    

    我导入了红色数据

块引用

public void importDataSet() throws Exception 
      IDataSet dataSet = readDataSet();
      cleanlyInsert(dataSet);
  

  private IDataSet readDataSet() throws Exception 
      return new FlatXmlDataSetBuilder().build(new File("/home/inta/workspace/JPAconPruebasUnitarias/src/test/sources/FlatXmlDataSet.xml"));
  

  private void cleanlyInsert(IDataSet dataSet)
      IDatabaseTester databaseTester;
    try 
        databaseTester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL, USER, PASSWORD);
        databaseTester.setSetUpOperation(DatabaseOperation.CLEAN_INSERT);
        databaseTester.setDataSet(dataSet);
        databaseTester.onSetup();
     catch (Exception e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    

  

注1:这里我假设数据库已经上传,所以初始化了。

我的问题是:为什么 miDao 指向 Null?我做错了什么?

注意2:我的数据集是:

<!DOCTYPE dataset SYSTEM "my-dataset.dtd" >
<dataset>
    <idioma palabra="playa" idioma="español"/>
    <idioma palabra="beach" idioma="ingles"/>
    <idioma palabra="platja" idioma="catalan"/>
</dataset>

非常感谢,这个社区很棒!

【问题讨论】:

特别是,我写了这个答案 - ***.com/a/24347569/139985 - 解释如何追查 NPE 的原因。 为什么这个问题的投票率如此之低?是的,它是重复的。是的,这完全是初学者的话题。但是,不,这个问题质量不错。 @Absurd-Mind - 你有一个有效的观点。不幸的是,这正是这里人们的行为方式。 @StephenC 虽然我同意这个问题不值得那么多反对票,但反对票按钮上的工具提示说“这个问题没有显示任何研究工作;它不清楚或没有用” -与问题本身的质量差无关,虽然问题写得很好,但它确实缺乏研究工作(OP 可以通过简单地在 Google 上搜索找到“什么是 NullPointerException,以及如何解决它?”。 【参考方案1】:

问题就在这里。

private IIdiomaDao miDao;// you have declare the miDao

但不初始化它。

然后你会在这里得到NullPointerException

miIdioma=miDao.find(Idioma.class, "playa"); // NullPointerException since
                                            // miDao is null

初始化miDao以避免NullPointerException

【讨论】:

以上是关于使用 DBUnit 配置单一测试时,我的通用 Dao 中出现“java.lang.NullPointerException”错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

玩转单元測试之DBUnit

DBUnit 错误 - 缺少以下 bean 之一:[dbUnitDatabaseConnection, dataSource]

phpunit 中的 dbunit 不会截断表

DbUnit-query 返回 BigInteger 类型的数据

将 DbUnit 与没有主键的表一起使用

如何使用 DBUnit 设置事务隔离级别