如何在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用于指出这一点。这是示例中的剪切粘贴错误。我会把它删掉的。