java - 使用 Intellij 在不同的包中编写单元测试调用私有(private)/ protected 方法

标签 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. 您已为生产代码选择了 Maven 默认源目录结构 src/main/java,为测试代码选择了 src/test/java。您应该将这两个目录声明为 IntelliJ 中的源文件夹(项目结构 -> 模块 -> 选择文件夹并单击 src/main/java 的“源”和 src/test/java< 的测试)

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

  3. 无法从相同或不同的包中调用私有(private)方法。为此,您必须使用反射。但最好至少应该将您的方法设置为 protected 或默认包。

  4. 您的测试应该使用 JUnit,而不是 main 方法。像这样的东西:

    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);
        }
    
    }
    

关于java - 使用 Intellij 在不同的包中编写单元测试调用私有(private)/ protected 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49340188/

相关文章:

java - 如何使用eclipse测量简单java程序的性能

java中缀计算器

java - 如何验证android中的范围?

java - 通过Intellij IDEA运行web应用程序时,编译好的webapp在哪里?

java - Google API 创建实例 - 字段 'resource.machineType' 的值无效

java - 架构 : Data Persistency , 搜索和推荐系统

tomcat - tomcat 9一开始是正常的,现在老是开始不灵了,怎么解决?

java - 在 java.library.path 上找不到基于 APR 的 Apache Tomcat Native 库,它允许在生产环境中实现最佳性能

java - Apache Tomcat 服务器不显示在 Intellij Idea 14 Ultimate 的 doGet() 方法中创建的 HTML

java - 部署 servlet 时遇到问题。(intellij ultimate)