2012-04-17 31 views
5

Tôi muốn đăng ký một số phạm vi web cho bối cảnh mùa xuân theo phương pháp @BeforeTest của mình. Nhưng hóa ra bối cảnh mùa xuân vẫn là null tại thời điểm đó.Truy cập ngữ cảnh mùa xuân trong @ngày thử nghiệm của Beforeng

Thử nghiệm chạy tốt, nếu tôi đổi thành @BeforeMethod. Tôi tự hỏi làm thế nào tôi có thể truy cập vào bối cảnh trong @BeforeTest, bởi vì tôi không muốn mã đăng ký phạm vi được lặp lại cho mỗi phương pháp thử nghiệm.

Dưới đây là các đoạn mã của tôi.

public class MyTest extends MyBaseTest { 
    @Test public void someTest() { /*...*/ } 
} 

@ContextConfiguration(locations="/my-context.xml") 
public class MyBaseTest extends AbstractTestNGSpringContextTests { 
    @BeforeTest public void registerWebScopes() { 
     ConfigurableBeanFactory factory = (ConfigurableBeanFactory) 
       this.applicationContext.getAutowireCapableBeanFactory(); 
     factory.registerScope("session", new SessionScope()); 
     factory.registerScope("request", new RequestScope()); 
    } 

    /* some protected methods here */ 
} 

Dưới đây là thông báo lỗi khi chạy thử nghiệm:

 
FAILED CONFIGURATION: @BeforeTest registerWebScopes 
java.lang.NullPointerException 
    at my.MyBaseTest.registerWebScopes(MyBaseTest.java:22) 

Trả lời

12

Gọi springTestContextPrepareTestInstance() trong phương pháp BeforeTest của bạn.

+0

Bạn có biết bất kỳ tài liệu nào về lý do tại sao các thành viên được tiêm không có sẵn trong các phương thức '@ BeforeTest' và thậm chí' @ BeforeSuite' không? – ecbrodie

+0

10x :) nó dễ dàng hơn sau đó viết trình xử lý bài đậu –

2

TestNG chạy @BeforeTest phương pháp trước @BeforeClass phương pháp. springTestContextPrepareTestInstance() được chú thích với @BeforeClass và thiết lập applicationContext. Đây là lý do tại sao số applicationContext vẫn là null theo phương thức @BeforeTest. @BeforeTest là dành cho một nhóm các bài kiểm tra được gắn thẻ. (Nó không chạy trước mỗi phương thức @Test, do đó, nó là một chút nhầm lẫn).

Thay vì sử dụng @BeforeTest, có thể bạn nên sử dụng @BeforeClass (được chạy một lần, trước @Test đầu tiên trong lớp hiện tại). Hãy chắc chắn nó phụ thuộc vào springTestContextPrepareTestInstance phương pháp, như trong

@BeforeClass(dependsOnMethods = "springTestContextPrepareTestInstance") 
public void registerWebScopes() { 
    ConfigurableBeanFactory factory = (ConfigurableBeanFactory) 
      this.applicationContext.getAutowireCapableBeanFactory(); 
    factory.registerScope("session", new SessionScope()); 
    factory.registerScope("request", new RequestScope()); 
} 

Các @BeforeMethod công trình, quá (như bạn nói) vì họ chạy sau @BeforeClass phương pháp.

+0

"' @ BeforeClass' (chạy trước bất kỳ '@ Tests' trong lớp hiện tại)". <- Điều này là không chính xác. Như đã nêu trong [Tài liệu TestNG] (http://testng.org/doc/documentation-main.html), '@ BeforeClass' sẽ được chạy trước khi phương thức thử nghiệm ** đầu tiên ** trong lớp hiện tại được gọi. – JonyD

+0

@JonyD, cảm ơn bạn đã chỉ ra điều này, từ ngữ không rõ ràng. Tôi đã chỉnh sửa nó dựa trên đề xuất của bạn. – kuporific

Các vấn đề liên quan