2012-06-20 8 views
8

Tiêu đề khá nhiều nói lên tất cả. Tôi muốn thiết lập một bài kiểm tra JUnit truyền thống để giả lập các phụ thuộc của bộ điều khiển và chạy thử nghiệm đối với các hành động.Đơn vị kiểm tra bộ điều khiển Play bằng cách sử dụng mocks

Tôi đã thấy rằng tôi có thể đạt được mục tiêu của tôi như thế này:

public class AccountsControllerTest { 
    private controllers.Accounts accountsController; 

    @Test 
    public void test() { 
     running(fakeApplication(), new Runnable() { 
      public void run() { 
       accountsController = new controllers.Accounts(); 
       accountsController.setAccountsWorkflow(mock(workflow.Accounts.class)); 
      } 
     }); 
    } 
} 

Các vấn đề rõ ràng ở đây là tôi đang instantiating lớp học của tôi được kiểm tra và tiêm phụ thuộc giả từ phương pháp thử nghiệm bản thân, khi tôi nên làm điều đó trong phương thức setup(). Có vẻ như phương pháp setup() là vô dụng nếu tôi sẽ kiểm tra bộ điều khiển theo cách truyền thống. Tất nhiên tôi có thể kiểm tra bộ điều khiển the way Play recommends, nhưng ứng dụng của tôi phụ thuộc vào dịch vụ web SOAP bên ngoài, vì vậy tôi cần kiểm tra đơn vị để cho thấy mã của chúng tôi đang hoạt động khi máy chủ của họ ngừng hoạt động.

Vì vậy, cách tốt nhất để kiểm tra đơn vị một bộ điều khiển Play bằng cách sử dụng mocks trong khi vẫn tận dụng các phương pháp setup()teardown() là gì?

Sửa

Tôi nhận ra tôi giả sử một số kiến ​​thức ở đây, vì vậy đối với những người không biết, điều khiển instantiation trong một thử nghiệm đơn vị phải được bọc trong một hàm running() hoặc Play! sẽ ném một ngoại lệ thời gian chạy nói rằng không có ứng dụng nào được khởi động.

+0

http://www.joergviola.de/blog/2012/06/04/page-driven-functional-tests-for-play-2-dot-0/ là một cách tốt đẹp để thử nghiệm quá, nhưng vẫn có vấn đề giả. Bạn có thể thử chạy thử nghiệm mà không có fakeApplication. Xem http://stackoverflow.com/questions/10381354/how-to-manipulate-session-request-and-response-for-test-in-play2-0 – niels

+0

http://stackoverflow.com/a/10114621/89509 –

+0

Cảm ơn ví dụ. Làm thế nào bạn có thể khởi tạo bộ điều khiển bên ngoài chức năng 'chạy'? Ràng buộc này là điều ngăn cản tôi sử dụng phương thức 'setup' của JUnit vì vậy tôi không phải thiết lập mocks trên mọi phương thức thử nghiệm. Ví dụ của bạn không thực sự chứng minh điều này. – Samo

Trả lời

1

Bạn có thể thực hiện việc này bằng Mockito và FakeApplication của Play và đặt biến Http.Context tĩnh.

Bằng cách này bạn có thể viết bài kiểm tra giống như tất cả các bài kiểm tra JUnit khác.

Ví dụ:

... 
import static play.test.Helpers.status; 
import play.test.FakeApplication; 
import play.test.Helpers; 
import play.mvc.Http; 
import play.mvc.Result; 
... 

@RunWith(MockitoJUnitRunner.class) 
public class ApplicationTest { 

    public static FakeApplication app; 

    @Mock 
    private Http.Request request; 

    @BeforeClass 
    public static void startApp() { 
     app = Helpers.fakeApplication(); 
     Helpers.start(app); 

    } 

    @Before 
    public void setUp() throws Exception { 
     Map<String, String> flashData = Collections.emptyMap(); 
     Http.Context context = new Http.Context(request, flashData, flashData); 
     Http.Context.current.set(context); 
    } 

    @Test 
    public void testIndex() { 
     final Result result = Application.index(); 
     assertEquals(play.mvc.Http.Status.OK, status(result)); 
    } 

    @AfterClass 
    public static void stopApp() { 
     Helpers.stop(app); 
    } 
+0

Tôi không biết bạn có thể đặt Http.Context hiện tại như thế - điều đó thật tuyệt; cảm ơn. – duma

+0

Tôi thấy rằng bằng cách đặt 'Http.Context.current.set (context);' các thử nghiệm tiếp theo của tôi dựa vào Ứng dụng không thành công. Vì vậy, bạn phải đặt bối cảnh trở lại trạng thái ban đầu của nó trong một @AfterClass. –