2012-02-20 6 views
5

Tôi có đoạn mã sau:bất kỳ (lớp MyClass.class) nào thực sự chỉ phù hợp với các lớp thuộc loại của lớp đã vượt qua?

verify(javaCompiler, times(1)).writeJavaAndCompile(any(ContractCompilationUnit.class), eq(outputDirectory)); 
verify(javaCompiler, times(1)).writeJavaAndCompile(any(ParamCompilationUnit.class), eq(outputDirectory));  

và mã của tôi là như sau:

javaCompiler.writeJavaAndCompile(new ContractCompilationUnit(), outputDirectory); 
javaCompiler.writeJavaAndCompile(new ParamCompilationUnit(), outputDirectory); 

Mã này được không, vì nó dường như 1st xác minh thấy rằng có 2 cuộc gọi đến javaCompiler.writeJavaAndCompile(). Không thể nhận ra rằng chỉ có một cuộc gọi kiểu ContractCompilationUnit.

Quy trình chuẩn để tránh hành vi này (ngoài việc phải viết đối sánh của riêng mình) là gì?

Trả lời

6

Các documentation cho thấy rằng đây là hành vi biết:

Bất kỳ đối tượng tốt bụng, không cần thiết của nhóm nhất định. Đối số lớp được cung cấp chỉ để tránh truyền. Đôi khi trông tốt hơn so với anyObject() - đặc biệt là khi đúc rõ ràng là cần thiết

Bí danh để anyObject()

Phương pháp này không làm bất kỳ kiểm tra kiểu, nó là duy nhất ở đó để tránh đúc trong mã của bạn . Tuy nhiên, điều này có thể thay đổi (loại kiểm tra có thể được thêm vào) trong một bản phát hành chính trong tương lai.

Dường như bạn nên sử dụng isA thay vì:

verify(javaCompiler).writeJavaAndCompile(isA(ContractCompilationUnit.class), 
             eq(outputDirectory)); 
+1

Vâng, chắc chắn 'isA'. Nhưng XIN không viết 'lần (1)' - nó không thêm bất cứ thứ gì và nó làm cho da của tôi bò. –

+0

@DavidWallace: Tôi chỉ đơn thuần sao chép mã gốc của OP :) Không sử dụng Mockito, tôi có lẽ có thể xóa hoàn toàn cuộc gọi đó? –

+0

Cảm ơn bạn đã làm như vậy, @JonSkeet. Bạn vừa làm cho thế giới trở thành một nơi yên tĩnh hơn. –