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

Java 使用Intellij在调用私有/受保护方法的不同包中编写单元测试,java,intellij-idea,Java,Intellij Idea,我意识到这个问题以前在这里被问过-> 然而,答案对我不起作用,我不明白为什么 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 MyAppTest.java 包/目录树: IntelliJ IDEA 2016.1.4

我意识到这个问题以前在这里被问过->

然而,答案对我不起作用,我不明白为什么

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

MyAppTest.java

包/目录树:

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

问题:

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

我尝试过的:

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


有人知道如何让它工作吗?

您的源目录和包是错误的

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

  • 您的包应该是相同的:
    com.simpleproject
    。问题是您声明了两个不同的包(
    main.java.com.simpleproject
    test.java.com.simpleproject
    ),这就是为什么您不能调用受保护的方法

  • 无法从相同或不同的包调用私有方法。你必须使用反射。但您最好至少将您的方法设置为受保护或包默认

  • 您的测试应该使用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);
        }
    
    }
    

  • 下面是我在尝试此操作时看到的所有问题->更改
    package main.java.com.simpleproject后的问题
    包com.simpleproject在“MyApp.java”->中,我还想添加使用eclipse->ok获得这些不同目录的人。删除updateNumPlusTwo方法的“private”修饰符。您需要导入JUnit:Project Structure->libraries如果您不想使用JUnit,可以尝试使用main方法,无需导入任何内容。