在Eclipse中向测试包中添加了一个junit测试文件,但该文件无法运行

时间:2019-03-09 21:27:58

标签: java junit4

我正在Eclipse IDE中使用JUnit4。我有一个包含7个测试的测试文件,通过选择以JUnit运行可以正常运行。 我为另一个测试集添加了另一个文件。我的文件中有1个测试。 我相信我正确地创建了测试... 这个文件/测试

@RunWith(MockitoJUnitRunner.class)
public class CloseSummaryOrCloseTrailerResponseTest {

    @InjectMocks
    XMLTransaction xmlTransaction;

    @Before
    public void initMocks() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void whenCloseSummaryResponseNoErrorExpectCorrectXmlMsgProduced ()
{
..code to run the test
}
}

当我选择文件并选择'Run As Junit'时,什么都没有发生。 我想念什么?

更新 抱歉,信息不完整...

项目树如下:     src / java / ...源文件     src / test / com / javaserver / transaction / RequestTest.java             /com/javaserver/transaction/ResponseTest.java

我可以运行RequestTest文件,所有测试都通过。 当我尝试运行ResponseTest文件时,最初没有任何输出。 我重新启动了Eclipse,并且在运行响应测试时收到错误消息:

  

org.mockito.exceptions.base.MockitoException:无法实例化   类型为“ ...”的@InjectMocks字段名为“ xmlTransaction” ...

我导入了XMLTransaction类。但是它不能被实例化。 我没有主要方法。我认为通过添加 @RunWith(MockitoJUnitRunner.class)可以运行该类。它运行另一个类文件。

更新 看来我要模拟的对象需要1参数构造函数。 构造函数如下所示:

XMLTransaction xmlTrans = new XMLTransaction(URL)

URL只是一个文本字符串,而不是实际的URL。 但是,如何实例化对象? 如果将其放在@InjectMocks下,则会出现编译错误:

  

默认构造函数无法处理异常类型   隐式超级构造函数。必须定义一个显式构造函数

更新 我需要使用PropertyManager类来创建XMLTransaction类。我使用@InjectMocks下的代码来做到这一点:

String wlUrl = PropertyManager.getInstance().getProperty(URL);

但是我得到了错误: 无法处理属性异常。

更新 我尝试将@MockInjects替换为@Mock并使用init()创建类:

 public final static String URL="WL_APPSERVER";  
    @Mock
    XMLTransaction xmlTransaction;  
    @Before
    public void initMocks() throws Exception {
        XMLTransaction xmlTransaction = new XMLTransaction(URL);
    }

我得到了错误: Mockito无法嘲笑此类:class

  

com.fedex.ground.tms.javaserver.dock.transaction.XMLTransaction。   Mockito只能模拟非私有和非最终类。底层   异常:java.lang.IllegalArgumentException:无法创建类型

如果添加不带参数的默认构造函数,则会出现相同的错误。 这是公开课,不是最终课程。

更新 我通过添加PropertyManager的实例解决了上述问题。 该对象需要一个属性文件。
现在的错误是它找不到属性文件。 我现在有这个。

@RunWith(MockitoJUnitRunner.class)
public class CloseSummaryOrCloseTrailerResponseTest {

     public final static String URL="WL_APPSERVER";
     public final static String PROP_FILE = "src/config/tms20.properties";

    @Mock
    XMLTransaction xmlTransaction; 

    @Mock
    PropertyManager propertyManager;

    @Before
    public void initMocks() throws Exception {
        MockitoAnnotations.initMocks(this);
        Properties p = new Properties();
        p.load(new FileReader(new File(PROP_FILE)));
        propertyManager.getInstance(PROP_FILE);
        XMLTransaction xmlTransaction = new XMLTransaction(URL);
    }

我需要识别什么属性文件?

2 个答案:

答案 0 :(得分:0)

将测试按如下所示放置在层次结构中:

project
    src
        main
             java      // source files
             resources // xml, properties etc
        test
             java      // source files
             resources // xml, properties etc

代码必须是这样的:

 @RunWith(MockitoJUnitRunner.class)
 public class ExampleTest {

     @Mock
     private List list;

     @Test
     public void shouldDoSomething() {
         list.add(100);
     }
 }

https://static.javadoc.io/org.mockito/mockito-core/2.6.8/org/mockito/junit/MockitoJUnitRunner.html

答案 1 :(得分:0)

问题在于构造函数正在调用私有方法来初始化类。由于Mockito无法处理私有方法,因此我使用PowerMock解决了该问题。