Tôi muốn biết về cách để kiểm tra chức năng diễn viên Akka, bởi chế giễu một số phương pháp (thực hiện phương pháp thay thế thực của đối tượng/diễn viên bằng cách chế giễu một) trong diễn viên.Làm thế nào để kiểm tra chức năng diễn viên Akka bởi chế giễu một hoặc nhiều biện pháp trong đó
Tôi sử dụng akka.testkit.TestActorRef
;
Ngoài ra: Tôi đã cố gắng sử dụng SpyingProducer
nhưng không rõ cách sử dụng. (giống như tôi nếu tôi tạo ra diễn viên bên trong việc thực hiện nó, nó sẽ giống như tôi hiện có). Kết quả tìm kiếm trên google về điều đó không phải là rất verbose.
Tôi sử dụng powemockito
và java
. Nhưng nó không quan trọng. Tôi sẽ được quan tâm để biết how to do it in principle
với bất kỳ ngôn ngữ với bất kỳ khuôn khổ
(vì vậy nếu bạn không biết cách điện/Mockito công trình chỉ cung cấp mã của bạn .. (xin) hoặc ý tưởng đầy đủ về cách bạn sẽ . làm điều đó với công cụ của bạn, bạn biết)
Vì vậy, giả sử chúng ta có một diễn viên để kiểm tra:
package example.formock;
import akka.actor.UntypedActor;
public class ToBeTestedActor extends UntypedActor {
@Override
public void onReceive(Object message) throws Exception {
if (message instanceof String) {
getSender().tell(getHelloMessage((String) message), getSelf());
}
}
String getHelloMessage(String initMessage) { // this was created for test purposes (for testing mocking/spy capabilities). Look at the test
return "Hello, " + initMessage;
}
}
Và trong thử nghiệm của chúng tôi, chúng tôi muốn thay getHelloMessage()
trả lại thứ gì đó khác.
Đây là cố gắng của tôi:
package example.formock;
import akka.testkit.TestActorRef;
...
@RunWith(PowerMockRunner.class)
@PrepareForTest(ToBeTestedActor.class)
public class ToBeTestedActorTest {
static final Timeout timeout = new Timeout(Duration.create(5, "seconds"));
@Test
public void getHelloMessage() {
final ActorSystem system = ActorSystem.create("system");
// given
final TestActorRef<ToBeTestedActor> actorRef = TestActorRef.create(
system,
Props.create(ToBeTestedActor.class),
"toBeTestedActor");
// First try:
ToBeTestedActor actorSpy = PowerMockito.spy(actorRef.underlyingActor());
// change functionality
PowerMockito.when(actorSpy.getHelloMessage (anyString())).thenReturn("nothing"); // <- expecting result
try {
// when
Future<Object> future = Patterns.ask(actorRef, "Bob", timeout);
// then
assertTrue(future.isCompleted());
// when
String resultMessage = (String) Await.result(future, Duration.Zero());
// then
assertEquals("nothing", resultMessage); // FAIL HERE
} catch (Exception e) {
fail("ops");
}
}
}
Kết quả:
org.junit.ComparisonFailure:
Expected :nothing
Actual :Hello, Bob
Làm thế nào bạn kiểm tra nó trong scala? chế nhạo ở đây có nghĩa là - để giả lập một phương pháp. tức là thay thế một phương thức trên đối tượng thực (đó là lý do chúng ta sử dụng spy() - để có thể thực hiện phương thức của chúng ta - cho phép phương thức biết trả về cho các tham số của phương thức cụ thể và không sử dụng cơ thể thực của phương thức trong onReceive () nhưng chế giễu một). "TestActorRef đặc biệt cung cấp cho bạn quyền truy cập vào diễn viên cơ bản" - đó là lý do tại sao tôi muốn sử dụng diễn viên này, nhưng không gửi thông điệp. Mocking và Spying là thực hành chung cho Java, và trong trường hợp này nó không hoạt động, mặc dù chúng ta có quyền truy cập vào diễn viên obj – ses
Và tại sao những kẻ scala tự hào đến mức họ biết scala nhưng không biết java? (không có hành vi phạm tội) :) – ses
Tôi biết java tốt hơn tôi biết scala - chỉ cần không phải là java java aki! – JasonG