2013-05-29 34 views
5

Lưu ý: Tôi đang sử dụng JUnit 4.11 và Netty 3.6.5.JUnit và Netty khiến đơn đăng ký kết thúc sớm

Tôi đang thử nghiệm một số chức năng cơ bản trong ứng dụng máy chủ phức tạp của mình. Tôi chỉ muốn trích xuất chức năng mạng và thực hiện một số kiểm tra đơn vị. Tuy nhiên, khi tôi cố gắng tạo một bài kiểm tra đơn vị, ứng dụng chỉ đơn giản là thoát. Tuy nhiên, nếu tôi đặt một dummy public static void main, nó hoạt động chính xác, nhưng bên ngoài của JUnit, rõ ràng. Đây là sscce:

public class SimpleNetwork { 
    private Injector inj; 

    @Before 
    public void startInjector() { 
     Module mod = new AbstractModule() { 
      @Override 
      protected void configure() { 
       // Guice stuff you don't need to see, it works fine 
      } 
     }; 
     inj = Guice.createInjector(mod); 
    } 

    // **When I run this using JUnit, the application ends immediately.** 
    @Test 
    public void testNetwork() { 
     NioServer server = inj.getInstance(NioServer.class); 
     server.run(); 

     // **This prints in both scenarios** 
     System.out.println("Hello World"); 
    } 

    // **When I run this, the application works as expected.** 
    public static void main(String[] args) { 
     SimpleNetwork sn = new SimpleNetwork(); 

     sn.startInjector(); 
     sn.testNetwork(); 
    } 
} 
+0

Bạn có thể gỡ lỗi vào NioServer không? – fge

+0

@fge Có, phương thức 'run' có lỗi' println' xảy ra – durron597

+2

Netty stuff là * không đồng bộ *, runner thử không đợi các luồng khác kết thúc, bạn phải sắp xếp nó trong phương thức thử nghiệm của mình. –

Trả lời

4

Junit sẽ thoát kiểm tra càng sớm càng thread junit được thực hiện trong khi chính sẽ chờ đề phi daemon chấm dứt trước khi thoát của bạn. Bạn cần tạm dừng chuỗi junit và đợi bất kỳ sự kiện nào xảy ra.

Không rõ những gì bạn đang cố gắng kiểm tra.

  • Nếu bạn chỉ cần kiểm tra xem máy chủ của bạn có thể bắt đầu không, thì thử nghiệm hiện tại của bạn sẽ thực hiện điều đó. Đặc biệt, liên kết bạn cung cấp cho thấy một máy chủ chạy trong một chuỗi nền để phương thức run trả về ngay lập tức. Vì vậy, kiểm tra của bạn kiểm tra xem phương thức run có trả về không có vấn đề gì không.
  • Nếu bạn muốn thực sự thực hiện máy chủ của mình bằng cách gửi dữ liệu và kiểm tra những gì được nhận (ví dụ). Trong trường hợp đó, bạn cần phải bao gồm mã kiểm tra máy chủ trong cùng một phương pháp thử nghiệm.

Một cách điển hình hơn của thử nghiệm một cái gì đó như thế sẽ được khởi động server một lần cho cả lớp kiểm tra toàn bộ:

private NioServer server; 
@BeforeClass 
public void beforeClass() { 
    server = getServer(); 
    server.run(); 
} 

@Test 
public void testOne() { 
    sendSomeDataToServer("data"); 
    assertEquals("data", server.getLastReceivedData()); 
} 

(Tôi không chắc chắn 100% về cú pháp JUnit như tôi sử dụng TestNG nhưng nó phải là một cái gì đó như thế)

+0

Lớp này là một phần của môi trường thử nghiệm máy chủ. Bạn đang nói, bắt đầu máy chủ trong '@ BeforeClass', sau đó thực hiện một số kết nối máy khách với chính nó? – durron597

+0

@ durron597 Đó là một cách có. Một cách khác là sử dụng các đối tượng giả. Chính xác thì bạn đang cố kiểm tra cái gì? Khi nào bạn mong đợi thử nghiệm vượt qua hoặc thất bại? Nếu bạn làm rõ rằng nó sẽ dễ dàng hơn để giúp bạn. – assylias

+0

Huh. Đặt câu hỏi đó khiến tôi tự hỏi liệu cách tiếp cận của tôi có đang cố gắng bao trùm quá nhiều mã cùng một lúc hay không. Tôi bắt đầu gõ "chắc chắn rằng máy chủ xây dựng và giải mã các đối tượng một cách chính xác", ngoại trừ tại sao tôi không thử nghiệm các bộ mã hóa trực tiếp sau đó? – durron597

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