2011-02-10 9 views
11

Đây là thử nghiệm:Làm thế nào để giả lập đối tượng với hàm tạo có một lớp?

import static junit.framework.Assert.assertTrue; 
import static org.powermock.api.mockito.PowerMockito.mock; 
import static org.powermock.api.mockito.PowerMockito.whenNew; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest({ClassUnderTesting.class}) 
public class ClassUnderTestingTest { 

    @Test 
    public void shouldInitializeMocks() throws Exception { 
     CollaboratorToBeMocked mockedCollaborator = mock(CollaboratorToBeMocked.class); 

      suppress(constructor(CollaboratorToBeMocked.class, InjectedIntoCollaborator.class)); 

     whenNew(CollaboratorToBeMocked.class) 
      .withArguments(InjectedAsTypeIntoCollaborator.class) 
      .thenReturn(mockedCollaborator); 

     new ClassUnderTesting().methodUnderTesting(); 

     assertTrue(true); 
    } 
} 

Đây là các lớp:

public class ClassUnderTesting { 

    public void methodUnderTesting() { 
     new CollaboratorToBeMocked(InjectedAsTypeIntoCollaborator.class); 
    } 

} 

public class CollaboratorToBeMocked { 

    public CollaboratorToBeMocked(Class<InjectedAsTypeIntoCollaborator> clazz) { 
    } 

    public CollaboratorToBeMocked(InjectedIntoCollaborator someCollaborator) { 
    } 

    public CollaboratorToBeMocked() { 
    } 

} 

public class InjectedAsTypeIntoCollaborator { 

} 

public class InjectedIntoCollaborator { 

} 

Đây là lỗi:

org.powermock.reflect.exceptions.TooManyConstructorsFoundException: Several matching constructors found, please specify the argument parameter types so that PowerMock can determine which method you're refering to. 
Matching constructors in class CollaboratorToBeMocked were: 
CollaboratorToBeMocked(InjectedIntoCollaborator.class) 
CollaboratorToBeMocked(java.lang.Class.class) 

Ở đây có câu hỏi: làm thế nào tôi có thể làm PowerMock tìm ra những gì constructor cần tìm?

Dòng có vấn đềsuppress. Đó là nơi lỗi xuất phát.

+1

Điều gì sẽ xảy ra khi bạn loại bỏ hàm tạo CollaboratorToBeMocked (java.lang.Class.class)? Nó có hoạt động không? – Davidann

+0

bạn có nghĩa là, khi tôi loại bỏ các constructor khác ... có, nếu tôi loại bỏ các nhà xây dựng với InjectedIntoCollaborator, nó hoạt động – Belun

Trả lời

2

Tôi không biết PowerMock cho đến khi bạn viết câu hỏi của mình, nhưng đã đọc và tìm thấy câu hỏi này trong tài liệu của họ. Tuy nhiên tôi không thực sự chắc chắn nếu điều đó giúp bạn:

Nếu lớp siêu có nhiều nhà xây dựng nó có thể nói PowerMock để chỉ ngăn chặn một cụ một. Giả sử bạn có một lớp được gọi là ClassWithSeveralConstructors có một hàm tạo có một chuỗi và một hàm tạo khác có tham số int làm đối số và bạn chỉ muốn để chặn hàm tạo String. Bạn có thể thực hiện việc này bằng cách sử dụng phương thức suppress(constructor(ClassWithSeveralConstructors.class, String.class)); .

tìm thấy tại http://code.google.com/p/powermock/wiki/SuppressUnwantedBehavior

nó không phải là điều bạn muốn?

EDIT: Bây giờ tôi thấy, bạn đã cố gắng đàn áp. Nhưng bạn có chắc chắn rằng bạn đã nhận được cuộc gọi đàn áp phải không? Không phải là đối số đầu tiên của constructor() được cho là lớp bạn muốn nhấn mạnh hàm tạo không?

+0

bạn đang phải. sự ngăn chặn của tôi là một mớ hỗn độn. tuy nhiên, nó vẫn không hoạt động tôi được sử dụng 'suppress (constructor (CollaboratorToBeMocked.class, InjectedIntoCollaborator.class));' – Belun

+0

um, thử nghiệm của tôi là xấu. một khi tôi đã sửa lớp thử nghiệm, bài kiểm tra đã chuyển sang màu xanh lục. vì vậy, vấn đề là, bây giờ, sự ngăn chặn. có thể là một lỗi ... – Belun

+0

Nếu bạn có một ví dụ hoàn chỉnh và vẫn không nhìn thấy kết quả mong đợi, tôi chắc chắn nên gửi một báo cáo lỗi cho dự án. –

17

Có thể đã quá muộn cho câu hỏi của bạn. Tôi đã gặp nó ngày hôm nay và tìm thấy giải pháp tại url sau. Về cơ bản, bạn cần phải xác định kiểu đối số của bạn như thế nào.

whenNew(MimeMessage.class).**withParameterTypes(MyParameterType.class)**.withArguments(isA(MyParameter.class)).thenReturn(mimeMessageMock); 

http://groups.google.com/group/powermock/msg/347f6ef1fb34d946?pli=1

Hy vọng nó có thể giúp bạn. :)

+1

Câu trả lời này phù hợp với tôi. Tôi đã có một tình huống với lớp ResponseEntity có một chữ T. ResponseEntity công cộng (MultiValueMap tiêu đề, HttpStatus statusCode) ResponseEntity công cộng (T cơ thể, HttpStatus statusCode) Nếu bạn sử dụng cú pháp: PowerMockito.whenNew (ResponseEntity.class) .withArguments (tiêu đề, statusCode). thenReturn (responseEntity); nó không hoạt động, nhưng PowerMockito.whenNew (ResponseEntity.class) .withParameterTypes (MultiValueMap.class, HttpStatus.class) .withArguments (tiêu đề, statusCode) .thenReturn (responseEntity); hoạt động – gaoagong