java—用junit示例化@before和@beforeclass变量时遇到问题

axzmvihb  于 2021-07-03  发布在  Java
关注(0)|答案(0)|浏览(230)

我正在测试新技术,并使用aws sam生成helloworld模板。
我为我的简单应用程序编写了一些简单的单元测试,但是我在使用时遇到了问题 @Before 以及 @BeforeClass . 如果我将initialize方法的内容移动到我的每个测试中,那么它们通过了,但我得到了所有 NullPointerException 当我试着分开做的时候。
最初我决定用 @Before 我的课是这样的-

package helloworld;

import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import org.junit.Before;
import org.junit.Test;

public class AppTest {
  App app;
  APIGatewayProxyResponseEvent result;
  String content;

  @Before
  public void initialize(){
    App app = new App();
    APIGatewayProxyResponseEvent result = app.handleRequest(null, null);
    System.out.println(result);
    String content = result.getBody();
    System.out.println(content);
  }

  @Test
  public void successfulResponseCode(){
    System.out.println("1 " + content);
    assertEquals(result.getStatusCode().intValue(), 200);
  }

  @Test
  public void successfulResponseString() {
    System.out.println("2 " + content);
    assertNotNull(content);
    assertTrue(content.contains("\"message\""));
    assertTrue(content.contains("\"hello world\""));
    assertTrue(content.contains("\"location\""));
  }
  @Test
  public void readsDatabase(){
    System.out.println("3 " + content);
    assertTrue(content.contains("Devon"));
    assertTrue(content.contains("Luana"));
  }
  @Test
  public void headersCreated(){
    System.out.println("4 " + content);
    assertEquals(result.getHeaders().get("Content-Type"), "application/json");
    assertTrue(result.getHeaders().get("Access-Control-Allow-Origin").contains("*"));
    assertEquals(result.getHeaders().get("Access-Control-Allow-Methods"), "*");
  }
}

initialize类中的系统日志输出正确,但在每个 @Test 他们是 null . 由于某些原因,示例化的变量不在测试范围内。
我是一个测试新手,我意识到我应该使用 @BeforeClass 不管怎样,因为我不需要为每个单独的测试打新的电话,我希望这可能会解决我的问题。它仍然不起作用,所以我把变量改成了静态的,但也没用。我相信这个错误一定很简单,但我想不出是什么。
我看到其他一些人也有同样的问题-junit@在没有正常工作之前,我尝试将变量更改为private,但仍然没有成功。
我也看到了这一点——java junit测试不使用@before注解,但我使用的是junit 4.13.1,尽管和作者一样,如果我只是在注解外初始化,我的测试就可以工作 @Before 像这样的注解-

package helloworld;

import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class AppTest {
  App app = new App();
  APIGatewayProxyResponseEvent result = app.handleRequest(null, null);
  String content = result.getBody();

//  @BeforeClass
//  public static void initialize(){
//    App app = new App();
//    APIGatewayProxyResponseEvent result = app.handleRequest(null, null);
//    System.out.println(result);
//    String content = result.getBody();
//    System.out.println(content);
//  }

  @Test
  public void successfulResponseCode(){
    System.out.println("1 " + content);
    assertEquals(result.getStatusCode().intValue(), 200);
  }

  @Test
  public void successfulResponseString() {
    System.out.println("2 " + content);
    assertNotNull(content);
    assertTrue(content.contains("\"message\""));
    assertTrue(content.contains("\"hello world\""));
    assertTrue(content.contains("\"location\""));
  }
  @Test
  public void readsDatabase(){
    System.out.println("3 " + content);
    assertTrue(content.contains("Devon"));
    assertTrue(content.contains("Luana"));
  }
  @Test
  public void headersCreated(){
    assertEquals(result.getHeaders().get("Content-Type"), "application/json");
    assertTrue(result.getHeaders().get("Access-Control-Allow-Origin").contains("*"));
    assertEquals(result.getHeaders().get("Access-Control-Allow-Methods"), "*");
  }
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题