netbeans 测试文件未检测到源类中的更新方法

xsuvu9jc  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(93)

我在Netbeans 15中遇到了这个问题。我正在使用OpenJDK的JDK 17。我用 Source PackagesTest Packages 配置了一个Web项目。与Tomcat 9一起运行。对我来说,通常的事情是改变源代码,并在Tomcat服务器中热重新加载,它工作得很好。到这里都没问题。
最近,我尝试更改一个类构造函数,它编译得很好。这里有一个类似的上下文类示例。

package com;

import javax.servlet.http.*;
import java.sql.Connection;
import java.sql.SQLException;

public class ClassA extends ClassAAbstract{

    /**
     * Creates a new instance of ClassA
     */
    public ClassA(HttpServletRequest request) throws SQLException {
        super(request);
    }

    public ClassA(HttpServletRequest request, String id) throws SQLException {
        super(request, id);
    }

    public ClassA(String str1, String str2, Connection conn) throws SQLException {
        super(str1, str2, conn);
    }

}

但是...当我想创建类测试时,我遇到了这个问题。上下文类似的测试类:

package com;

import Types.DatabaseDependableTest;
import com.ClassA;
import java.sql.SQLException;
import org.junit.Test;

public class ClassATest extends DatabaseDependableTest {

    public ClassATest () {
        super();
    }

    @Test
    public void test() throws SQLException {
        new ClassA("", "", this.conn); -> error

    }

}

显示的错误显示以下内容:

  • 找不到适合ClassA(String,String,Connection)构造函数com的构造函数。ClassA(HttpServletRequest)不适用 *

它建议使用另外两个构造函数。有没有人能猜到会发生什么?
我试过了
1.关闭并重新打开项目。
1.删除NetBeans项目文件夹并再次打开它
1.已删除缓存并再次尝试这两个选项。
值得一提的是,我有一个这个环境的副本(以前的版本。相同的组件,JDK 17,Tomcat 9...),当我更新源代码中的类方法时,那里的测试工作得非常好。

编辑1

我取得了进展,并发现了以下情况。
如果我有一个包A和它里面的类A1、A2、A3,那么测试包中的测试将不会识别这些类的任何进一步更新,因为它的初始配置。
示例:

package A;

class A {
    public A(String str){
    }
}

下面的测试有效:

package Test;

class ATest {
    public ATest (){
    }
    
    @Test
    public void test(){
        new A("STRING");
    }

}

如果我给类A添加一个新的构造函数,那么我就不能在测试中使用。

package A;

class A {
    public A(String str){
    }
    public A(String str,String str2){ -> New constructor
    }
}

类似以下的测试将不起作用

package Test;

class ATest {
    public ATest (){
    }
    
    @Test
    public void test(){
        new A("STRING","STRING"); -> error ( constructor A in...)
    }
}

然而,如果我在包A中创建一个新的类,比如说ANewClass,那么我可以创建一个可编译的测试,并更改其代码,因为它将在测试中考虑。

package A;

class ANewClass  {
    public ANewClass (String str){
    }
    public ANewClass (String str,String str2){
    }
}

下面的测试有效:

package Test;

class ATest {
    public ATest (){
    }
    
    @Test
    public void test(){
        new ANewClass("STRING");
        new ANewClass("STRING","STRING");
    // Both OK!
    }
}

我猜可能是类路径或某个缓存构建的问题。

编辑2

由于我还使用Netbeans集成将此代码部署到Tomcat,因此我检查了代码,并且代码在部署时有效地工作。问题具体存在于测试包中或与之相关。

解决方案

我有一个库/jar,它有相同的类,所以我猜它一定是覆盖了源代码实现,我认为这是错误的,因为 .class 文件应该优先于库。无论如何,由于代码和jar是一样的,我删除了它,工作得很好。

f8rj6qna

f8rj6qna1#

有一个重复的资源正在覆盖正在更新的资源。特别是一个包含源代码的jar,这些源代码也存在于源代码包中,并且首先被加载,而不考虑最后一个。删除JAR文件解决了问题。

相关问题