【问题标题】:mocking a method with a dynamic datasource使用动态数据源模拟方法
【发布时间】:2023-01-17 22:10:00
【问题描述】:

我需要测试此方法,但我不知道如何在不连接到服务器上的数据库的情况下进行测试。

public List<String> searchQuery(String key) {
    List<String> resultList = null;
    try {
        this.createConnection(CheckDataServlet.getKey(Integer.parseInt(key)).getConnection().getName());
        stmt = conn.prepareStatement(CheckDataServlet.getKey(Integer.parseInt(key)).getSelect().trim());
        rs = stmt.executeQuery();
        resultList = this.getValues(rs);
    } catch ( SQLException e) {
        Archicon.getLogger().error("ValidationData.searchQuery error: "+e);
    }finally {
        this.closeConnection("searchQuery",conn,stmt,rs);
    }
    if (resultList == null) {
        resultList = new ArrayList<>();
    }

    return resultList;
}

public void createConnection(String key){
        try {
            ds = (DataSource) Archicon.getResource("jdbc/"+key);
            conn = ds.getConnection();
        } catch (SQLException | NamingException e) {
            throw new RuntimeException(e);
        }
    }

我尝试使用 Mockito 进行测试,但总是给我这个错误,因为数据源为空:

java.lang.NullPointerException
at it.sisal.archicon.model.valor.ValidationData.createConnection(ValidationData.java:157)
at it.sisal.archicon.model.valor.ValidationData.searchQuery(ValidationData.java:23)
at it.sisal.archicon.model.valor.AwpSapNewRepositoryTest.searchQuery(AwpSapNewRepositoryTest.java:95)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

我试图构建这个测试类:

    public void setup() throws SQLException {
//        Query q = em.createNativeQuery("Create Table repnorm_bersani_sap; Insert into repnorm_bersani_sap(name varchar, stato number) value(\"Ciao\", 99);");
//        q.executeUpdate();
      when(validationData.searchQuery("11")).thenReturn(new ArrayList<>(List.of("Name, 99","Stuff, 99")));
    }
 @Test
    public void searchQuery() throws NamingException {
        ValidationData validationData;
      //  System.setProperty("jboss.server.config.dir","C:\\Program Files\\wildfly-18.0.0.Final\\standalone\\configuration\\archicon");
       Archicon.setConfigPath("C:\\Program Files\\wildfly-18.0.0.Final\\standalone\\configuration\\archicon");
        validationData = new ValidationData();
        assertEquals(true,validationData.searchQuery("11").size()>0);
    }
    @Inject
    private UserTransaction utx;
    @Mock
    private EntityManager em;
     @Mock
   private ValidationData validationData;

有人知道测试这种方法的好方法吗?

【问题讨论】:

    标签: java junit mockito wildfly datasource


    【解决方案1】:

    您可以使用 mockito 模拟 Archicon 类的静态方法以返回 DataSource 的模拟:

    try (final MockedSatic<Archicon> archicon= Mockito.mockStatic(Archicon.class)) {
        DataSource ds = mock(DataSource.class);
        archicon.when(() -> Archicon.getResource(any())).thenReturn(ds);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 2014-08-30
      • 2014-02-02
      • 1970-01-01
      相关资源
      最近更新 更多