gpt4 book ai didi

java - "Mock"固定参数方法

转载 作者:行者123 更新时间:2023-11-30 10:18:37 26 4
gpt4 key购买 nike

我的项目中有一个“Mailer”类(当然可以发送电子邮件)。为了进行测试,我希望将 Mailer#send(String toAddress) 的每次调用替换为 Mailer#send("mail@example.com")

所以像这样:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassCallingMailer.class})
public class TestClass {

@Test
public void testMethod() {
Mailer mailerMock = mock(Mailer.class);
// this is where the magic happens; replace any toAddress with fixed email address
when(mailerMock.send(any(String.class))).thenReturn(mailerMock.send("mail@example.com"));
try {
whenNew(Mailer.class).withAnyArguments().thenReturn(mailerMock);
} catch (Exception e) {
e.printStackTrace();
}

ClassCallingMailer someClass = new ClassCallingMailer();
assertTrue(someClass.methodSendingMail());
}
}

这段代码显然行不通,但是可以通过某种方式实现吗?也许这是一个完全错误的方法?

谢谢。


更新

我不太确定这有多好,但它确实有效:

// ClassCallingMailer (no changes, just for completeness)
public class ClassCallingMailer {
public boolean methodSendingMail() {
Mailer mail = new Mailer();
return mail.send(someEmailAddress);
}
}

// TestMailer (new class)
public class TestMailer extends Mailer {
// add all constructors from Mailer
@Override
public boolean send(String to) {
return super.send("mail@example.com");
}
}

// TestClass (with changes)
@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassCallingMailer.class})
public class TestClass {

@Test
public void testMethod() {
// changed mock to spy and replaced Mailer with TestMailer
Mailer mailerMock = spy(TestMailer.class);
// removed "when(...).thenReturn(...)"
try {
whenNew(Mailer.class).withAnyArguments().thenReturn(mailerMock);
} catch (Exception e) {
e.printStackTrace();
}

ClassCallingMailer someClass = new ClassCallingMailer();
assertTrue(someClass.methodSendingMail());
}
}

最佳答案

如果你只想实现这种行为,我建议不要通过模拟来实现。您可以扩展您的 Mailer 类以拥有一些 TestMailer,您可以在其中执行类似以下操作:

@Override
public void send(String toAddress){
super.send("mail@example.com");
}

基本上,您覆盖了 Mailer 的原始发送并使用预定义的地址调用它。

您可以在测试中使用这个新的子类。

关于java - "Mock"固定参数方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49152118/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com