【问题标题】:gradle junit and error: cannot find symbolgradle junit 和错误:找不到符号
【发布时间】:2016-02-08 11:16:15
【问题描述】:

我正在尝试在我已编译并部署到 aws lambda 的概念证明类上从 gradle 运行一个简单的 junit 测试。 Auth.java 类采用具有单个属性 email 的 POJO。它可以自行编译并在 aws 上运行。但是,当我运行时:

gradle build

我收到以下错误:

Auth.java:6: error: cannot find symbol
System.out.println(payload.email);
symbol:   variable email
location: variable payload of type Object
1 error
:compileJava FAILED

如果我在TestAuth.javaSystem.out.println(payload.email); 我可以访问对象的属性没问题。我在这里没有掌握一些关键的 java 或 gradle 概念吗?我已经用 5 种不同的方式重构了这些东西,但我总是收到这个找不到符号错误。有人有什么想法吗?这是我的简化代码。


./src/main/java/Auth.java

package works.valt.api;

public class Auth {

    public Auth(Object payload) {
        System.out.println(payload.email);
    }

}

./src/test/java/TestAuth.java

import org.junit.Test;
import org.junit.Before;
import static org.junit.Assert.assertEquals;
import works.valt.api.Auth;

public class TestAuth {

    public class Payload {
      public String email = "test@testing.com";
    }

    private Payload payload;

    // create payload
    @Before
    public void setUp() {
      this.payload = new Payload();
    }    

   @Test
   public void testResponse() {
      Auth response = new Auth(this.payload);
   }

}

build.gradle

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    testCompile 'junit:junit:4.12'
}

test {
    testLogging.showStandardStreams = true
}

task buildZip(type: Zip) {
    from compileJava
    from processResources              
    into('lib') {
        from configurations.runtime
    }           
}

build.dependsOn buildZip

【问题讨论】:

    标签: java gradle junit compiler-errors


    【解决方案1】:

    Auth 的构造函数有一个 Object 类型的参数。而Object 类没有名为email 的变量。将参数类型改为Payload

    【讨论】:

    • 等一下,刚刚尝试解决这个问题....我正在将 Payload 的一个实例传递给构造函数。构造函数接受 Object,Payload 是一个 Object……那么为什么属性会被丢弃?
    • 因为编译器会尝试在Object 中找到不存在的email 变量。
    【解决方案2】:

    这是Auth的构造函数

    public Auth(Object payload) {
        System.out.println(payload.email);
    }
    

    payload 参数的类型为 Object,因此在 Object 类定义中找不到字段 email,这就是编译器所抱怨的:

    Auth.java:6: error: cannot find symbol
    System.out.println(payload.email);
    symbol:   variable email
    location:
    variable payload of type Object
    

    您要么将参数类型更改为Payload,要么在构造函数中强制转换引用并失去一些编译时类型安全

    【讨论】:

    • 你能给我举个例子吗?
    • 将Payload定义放在api包中自己的类中,然后在Auth的构造函数中将Obejct替换为Payload
    • 你能给我一个投射参考的例子吗?我很难理解你的意思。我需要保持 Object 通用,因为我不确定有效负载会是什么样子。有效负载是由 AWS Lambda 自动序列化的 JSON 对象。即自动序列化为对象。如果它必须是一个加固的结构,那么我可能会一起放弃 java 路由。
    • 这是工作中的演员(Payload) objectRef - 但是你真的应该使用MapJsonObject
    【解决方案3】:

    问题是有效载荷是一个对象而不是有效载荷

    您实际上必须说它是一个有效负载才能访问该属性:

    package works.valt.api;
    
    public class Auth {
    
        public Auth(TestAuth.Payload payload) {
            System.out.println(payload.email);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-25
      • 2021-12-16
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      相关资源
      最近更新 更多