gpt4 book ai didi

unit-testing - 正确的单元测试 : testing a method with no [accessible] state or return value

转载 作者:行者123 更新时间:2023-12-04 10:33:08 24 4
gpt4 key购买 nike

我对单元测试有些陌生。关于正确测试的一件事(目前)让我感到困惑。

例如,如果 main 方法没有状态且只有控制台输出,你如何测试它?像这样,myServer 方法和状态在哪里是私有(private)的?

 public static void main(String[] args)
{
Server myServer = new Server()
if(myServer.start())
System.out.println("started");
else
System.out.println("failed");
}

我不想更改我的代码并公开我的服务器方法和状态以将它们公开。

注意,我不是在问如何测试 myServer.start(),我是在问如何测试 main() 本身。

请告诉我。

多谢你们,
吉布

最佳答案

主要方法应该很薄,只是让球滚动。因此一般不测试。
例如.net Winforms 应用程序 Main 方法可能包含

static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainWindow());
}

如果您的主要方法正在做很多事情,请考虑提取一个方法(如果需要,可以提取一个新类)。例如如下图...(手边没有JavaIDE.. .net 后面的代码应该很容易翻译)
static void Main()
{
new MainApp().Run();
}

现在如果可以测试 Run .. Main 也被覆盖了。让我们看看 MainApp。重构了启动服务器和将结果记录为 2 个方法的 2 个任务。
public class MainApp
{
private Server m_Server;
public MainApp():this(new Server())
{}
public MainApp(Server s)
{ m_Server = s; }

public void Run()
{ Log(LaunchServer()); }

private string LaunchServer()
{ return (m_Server.start() ? "started" : "failed"); }

protected virtual void Log(string sMessage)
{ System.Console.WriteLine(sMessage); }
}

现在让我们看看测试代码...我将使用“子类和覆盖”技巧来缓存结果,如下所示。 (你也可以使用 Mocks.. 根据口味)
public class FakeApp : MainApp
{
private string sLastLoggedMessage;

public FakeApp(Server s) : base(s) { }

public string getLastLoggedMessage()
{ return sLastLoggedMessage; }

protected override void Log(string sMessage)
{ sLastLoggedMessage = sMessage; }
}

测试现在很简单
[TestFixture]
public class TestMainApp
{
[Test]
public void TestRun()
{
Server s = new Server();
FakeApp f = new FakeApp(s);

f.Run();

Assert.AreEqual("started", f.getLastLoggedMessage());
}
}

如果您不能强制 Server.start() 根据您的意愿成功或失败.. 您可以创建一个 FakeServer.. 子类并覆盖 start() 以返回固定值。

如果一个方法做某事,它可以被测试。如果没有,它应该不复存在。重构它。高温高压

关于unit-testing - 正确的单元测试 : testing a method with no [accessible] state or return value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/452689/

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