如何在Scala中模拟对象(InetAddress.getLocalHost.getHostName)

如何在Scala中模拟对象(InetAddress.getLocalHost.getHostName),scala,unit-testing,mockito,powermock,scalatest,Scala,Unit Testing,Mockito,Powermock,Scalatest,我有一些这样的代码: import java.net.{InetAddress, UnknownHostException} import org.junit.Test import org.junit.runner.RunWith import org.mockito.BDDMockito.`given` import org.mockito.Mock import org.powermock.api.mockito.PowerMockito.mockStatic import org.pow

我有一些这样的代码:

import java.net.{InetAddress, UnknownHostException}
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.BDDMockito.`given`
import org.mockito.Mock
import org.powermock.api.mockito.PowerMockito.mockStatic
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import org.scalatest.FunSuite
class XYZ {
  def getAppendedName(prependage: String): String = {
    s"$prependage ${InetAddress.getLocalHost.getHostName}"
  }
}

@RunWith(classOf[PowerMockRunner])
class SomeTestSuite extends FunSuite {

  @Mock val inetAddress: InetAddress = InetAddress.getLocalHost

  @Test
  @throws[UnknownHostException]
  def shouldReturnMocked(): Unit = { //given
    mockStatic(classOf[InetAddress])
    given(InetAddress.getLocalHost).willReturn(inetAddress)
    given(inetAddress.getHostName).willReturn("mocked")
    //when
    val name = (new XYZ).getAppendedName("is")
    //then
    assert(name == "is mocked")
  }
}
import somestuff
import xxxx.XYZ

@RunWith(classOf[JUnitRunner])
class ValidationSuite extends FunSuite {
 
  test("this mock test") {
      // Setup
      val name = (new XYZ).getAppendedName("is")
      assert(name == "is mocked")
  }
}
而且。。。我已经对这段代码进行了一个又一个的建模,但我似乎无法让它运行

我有两个错误:

有两次失败:

1) Test mechanism 
java.lang.NullPointerException

and
  2) shouldReturnMocked(com.xyz.abc)
                     org.mockito.exceptions.misusing.MissingMethodInvocationException: 
                     when() requires an argument which has to be 'a method call on a mock'.
                     For example:
                         when(mock.getArticles()).thenReturn(articles);
                     
                     Also, this error might show up because:
                     1. you stub either of: final/private/equals()/hashCode() methods.
                        Those methods *cannot* be stubbed/verified.
                        Mocking methods declared on non-public parent classes is not supported.
                     2. inside when() you don't call method on mock but on some other object.
stacktrace被省略,但指向:
给定(InetAddress.getLocalHost)。将返回(InetAddress)
给定(inetAddress.getHostName)。将返回(“模拟”)
,具体取决于切换顺序时哪个是第一个

奖金问题:

我希望将格式更改为我所熟悉的格式,以便测试按如下方式运行:

import java.net.{InetAddress, UnknownHostException}
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.BDDMockito.`given`
import org.mockito.Mock
import org.powermock.api.mockito.PowerMockito.mockStatic
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import org.scalatest.FunSuite
class XYZ {
  def getAppendedName(prependage: String): String = {
    s"$prependage ${InetAddress.getLocalHost.getHostName}"
  }
}

@RunWith(classOf[PowerMockRunner])
class SomeTestSuite extends FunSuite {

  @Mock val inetAddress: InetAddress = InetAddress.getLocalHost

  @Test
  @throws[UnknownHostException]
  def shouldReturnMocked(): Unit = { //given
    mockStatic(classOf[InetAddress])
    given(InetAddress.getLocalHost).willReturn(inetAddress)
    given(inetAddress.getHostName).willReturn("mocked")
    //when
    val name = (new XYZ).getAppendedName("is")
    //then
    assert(name == "is mocked")
  }
}
import somestuff
import xxxx.XYZ

@RunWith(classOf[JUnitRunner])
class ValidationSuite extends FunSuite {
 
  test("this mock test") {
      // Setup
      val name = (new XYZ).getAppendedName("is")
      assert(name == "is mocked")
  }
}
如何使上述代码正常工作?我也愿意使用scalatestplus mockito 3.2解决方案,但不愿意重构代码(遵循上述示例的模式)

注意:我通过以下操作找到了这个示例:

val xyz = new XYZ {

    override def getAppendedName(prependage: String): String = {
    s"$prependage mocked host"
  }
}

但是,在我的例子中,代码是在下面调用的
getAppendedName
,其中该方法调用其他类和对象方法,这些方法随后调用
InetAddress
。在这些更深的层中,代码应该被模拟。

您想用这行代码实现什么
@PrepareForTest(数组(classOf[Nothing])
@VladimirKorenev-Thx用于指出这一点。这是示例中的剪切粘贴错误。我会把它删掉的。