2013-03-01 12 views
6

Tôi cũng mới sử dụng Mockito và PowerMockito. Tôi phát hiện ra rằng tôi không thể kiểm tra các phương pháp tĩnh với Mockito thuần túy vì vậy tôi cần phải sử dụng PowerMockito (phải không?).Vì lý do gì tôi nên thử?

tôi có lớp học rất đơn giản gọi là Validate với phương pháp này rất dễ dàng

public class Validate { 
     public final static void stateNotNull(
      final Object object, 
      final String message) { 
    if (message == null) { 
     throw new IllegalArgumentException("Exception message is a null object!"); 
    } 
    if (object == null) { 
     throw new IllegalStateException(message); 
    } 
} 

Vì vậy, tôi cần phải xác minh rằng:

1) Khi tôi gọi đó là phương pháp tĩnh trên lập luận nhắn null, IllegalArgumentException được gọi là
2) Khi tôi gọi đó là phương pháp tĩnh trên lập luận đối tượng null, IllegalStateException được gọi

Từ những gì tôi có cho đến nay, tôi đã viết bài kiểm tra này:

import static org.mockito.Matchers.anyString; 
import static org.mockito.Matchers.isNull; 

import org.junit.Before; 
import org.junit.runner.RunWith; 
import org.powermock.api.mockito.PowerMockito; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 
import org.testng.annotations.Test; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Validate.class) 
public class ValidateTestCase { 

    @Test(expectedExceptions = { IllegalStateException.class }) 
    public void stateNotNullTest() throws Exception { 
     PowerMockito.mockStatic(Validate.class); 
     Validate mock = PowerMockito.mock(Validate.class); 
     PowerMockito.doThrow(new IllegalStateException()) 
      .when(mock) 
      .stateNotNull(isNull(), anyString()); 
     Validate.stateNotNull(null, null); 
    } 
} 

Vì vậy, đây nói rằng tôi chế nhạo lớp Validate và tôi đang kiểm tra rằng khi mô hình được gọi là phương pháp mà với lập luận null như một đối tượng và bất kỳ chuỗi dưới dạng tin nhắn, một IllegalStateException được ném.

Bây giờ, tôi thực sự không hiểu. Tại sao tôi không thể gọi trực tiếp phương pháp đó, thả toàn bộ ma thuật voodoo xung quanh chế nhạo lớp tĩnh đó? Dường như với tôi rằng trừ khi tôi gọi Validate.stateNotNull rằng kiểm tra đi anyway ... Vì lý do gì tôi nên thử nó?

Trả lời

8

Trước tiên, hãy quyết định mục tiêu của bạn là gì và bạn muốn kiểm tra điều gì. Thử nghiệm của bạn không thử nghiệm phương thức lớp Validate của bạn, nó tạo ra một mô hình hoạt động giống như phương thức đó, như Fortega points out. Xác định những gì bạn đang thử nghiệm (đối tượng đang thử nghiệm) và bạn cần gì để thực hiện bài kiểm tra (các cộng tác viên), sau đó xem xét các cộng tác viên và quyết định xem họ có phải là những thứ dễ tạo hoặc nếu bạn cần để chế giễu chúng.

Đối với một cái gì đó như lớp này mà không phụ thuộc vào bất cứ điều gì, tôi sẽ khuyên bạn nên làm mà không có mocks hoàn toàn. Không có gì ở đây cần mocking, thử nghiệm có thể được viết như thế này:

import static org.junit.Assert.*; 

public class ValidateTestCase { 

    @Test 
    public void testHappyPath() throws Exception { 
     Validate.stateNotNull("", ""); 
    } 

    @Test 
    public void testNullMessage() throws Exception { 
     try { 
      Validate.stateNotNull(null, null); 
      fail(); 
     } 
     catch (IllegalStateException e) { 
      String expected = "Exception message is a null object!" 
      assertEquals(expected, e.getMessage()); 
     } 
    } 

    @Test(expected=IllegalStateException.class) 
    public void testNullObject() throws Exception { 
     Validate.stateNotNull(null, "test"); 
    } 
} 

và điều đó cho bạn biết mã có làm những gì bạn muốn.

Không giả lập trừ khi có một số phụ thuộc mà bạn muốn tránh đưa vào thử nghiệm do nó là tài nguyên bên ngoài (như hệ thống tệp hoặc cơ sở dữ liệu) hoặc một số hệ thống con phức tạp. Các khuôn mẫu giả có thể rất hữu ích nhưng chúng thêm tính phức tạp, chúng có thể chỉ rõ hành vi của những thứ mà chúng đang thử nghiệm, làm cho các bài kiểm tra trở nên giòn và chúng có thể làm cho các bài kiểm tra khó đọc. Làm mà không có chúng nếu bạn có thể.

11

Bạn không nên thử các lớp và phương pháp bạn đang thử nghiệm. Bạn chỉ nên thử các phương thức cần thiết để thực hiện kiểm tra. Ví dụ, nếu bạn cần một số đối tượng từ một dịch vụ web để thực hiện kiểm tra, bạn có thể thử các cuộc gọi dịch vụ web, vì vậy bạn không cần thực sự gọi dịch vụ web.