使用Intellij在不同的包中写入单元测试调用私有/受保护的方法

时间:2018-03-17 18:03:57

标签: java intellij-idea

我在此之前已经意识到这个问题 - > How to create a test directory in Intellij 13?

然而,答案对我不起作用,我无法弄清楚为什么......

Intellij版本:

IntelliJ IDEA 2016.1.4
Build #IC-145.2070, built on August 2, 2016
JRE: 1.8.0_77-b03 x86
JVM: Java HotSpot(TM) Server VM by Oracle Corporation

MyApp.java

package main.java.com.simpleproject;

public class MyApp {
    private int updNum;

    public MyApp(int givenNum){
        this.updNum = givenNum;
    }

    private void updateNumPlusTwo(){
        this.updNum += 2;
    }

    protected int getUpdatedNum(){
        return this.updNum;
    }
}

MyAppTest.java

package test.java.com.simpleproject;

import main.java.com.simpleproject.MyApp;

public class MyAppTest {
    public static void main(String[] args) {
        MyApp app = new MyApp(4);

        app.getUpdatedNum();
        app.updateNumPlusTwo();
    }
}

包/目录树:

enter image description here

问题:

enter image description here

我尝试了什么:

enter image description here

任何人都知道如何让它发挥作用?

1 个答案:

答案 0 :(得分:1)

您的sources目录和包是错误的。

  1. 您为生产代码选择了src/main/java的Maven默认源目录结构,为测试代码选择了src/test/java。您应该将这两个目录声明为IntelliJ中的源文件夹(项目结构 - >模块 - >选择文件夹,然后单击src/main/java的来源和src/test/java的测试)

  2. 您的包裹应该相同:com.simpleproject。问题是您已声明了2个不同的包(main.java.com.simpleprojecttest.java.com.simpleproject),这就是您无法调用受保护方法的原因。

  3. 无法从相同或不同的包调用私有方法。你必须使用反射。但最好至少应该保护您的方法或默认包。

  4. 您的测试应使用JUnit,而不是主方法。类似的东西:

    package com.simpleproject;
    
    import static org.assertj.core.api.Assertions.assertThat; 
    
    public class Test {   
    
        @Test
        public void shouldTestMyClass() {
           // Given
           int givenNum = 3;
    
           // When
           MyApp myApp = new MyApp(givenNum);
           myApp.updateNumPlusTwo();
    
           // Then (use AssertJ library for example)
           assertThat(myApp.getUpdatedNum()).isEqualTo(5);
        }
    
    }