PHPUnit让我使用以下任一方法创建方法存根以抛出异常:
[->will($this->throwException(..)][1]->willThrowException(..我需要测试方法存根抛出PHP错误的一些情况.
PHPUnit是否支持这样的东西?这里有变通方法吗?
我曾经在 Eclipse 中工作,有一个非常简洁的热键 ( Ctrl+ O),用于搜索类中的方法。
我的意思是,如果您在编辑器中查看类的源代码,并且点击Ctrl+ O,则会弹出一个列出所有方法的窗口。如果您开始输入,该列表将被过滤。如果我输入get,我可以看到一个 getter 列表..
这非常有帮助。我转向了 PHP 和 PhpStorm,在这里我很想念这个功能,或者我不知道 PhpStorm 是否有这个功能。
你们对 PhpStorm 中的这样一个关键组合有任何想法吗?
请参阅下面的剪辑
USPresident usPresident = new USPresident(56);
try (ObjectOutputStream oos = new ObjectOutputStream(new
FileOutputStream("/home/nikhil/dev/USPresident.data"))){
oos.writeObject(usPresident);
usPresident.setTerm(57);
oos.writeObject(usPresident);
System.out.println("Serialized");
}
Run Code Online (Sandbox Code Playgroud)
创建了一个总统实例,任期为56.将其序列化.将术语重置为57再次序列化
但是,当我反序列化对象时,它的术语仍为56(而不是57!)
我在书上看到了这个解释,
是的,即使您使用其setter将术语更改为57并再次序列化,它也将打印56.这是由于serialVersionUID引起的,在序列化时由JVM检查.如果某个类已经序列化并且您尝试再次对其进行序列化,则JVM将不会对其进行序列化.
但是,据我所知,serialVersionUID用于在反序列化期间检查Class对象是否与序列化对象匹配.此外,serialVersionUID用作Object签名的标识符,而不是状态.
不明白这里发生了什么.有人可以解释这种行为吗?
看一下ObjectOutputStream的实现,这就是writeObjet的实现方式
public final void writeObject(Object obj) throws IOException {
if (enableOverride) {
writeObjectOverride(obj);
return;
}
try {
writeObject0(obj, false);
} catch (IOException ex) {
if (depth == 0) {
writeFatalException(ex);
}
throw ex;
}
}
Run Code Online (Sandbox Code Playgroud)
请参阅boolean enableOverride.写'修改'对象必须如此.但是,只有在使用ObjectOutputStream的子类时,才能将其设置为true.请参阅下面的受保护构造函数,
protected ObjectOutputStream() throws IOException, SecurityException {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(SUBCLASS_IMPLEMENTATION_PERMISSION);
}
bout …Run Code Online (Sandbox Code Playgroud) 我试图将输入的数字流转换为整数数组.代码应该是自我解释的.
$handle = fopen("php://stdin","r");
print("Enter space separated numbers to be made to an array\n");
$numStream = fgets($handle);
print("Creating array from : {$numStream}\n");
//Using explode to create arrays
//now we have an array of Strings
$numArray = explode(" ", $numStream);
var_dump($numArray);
print(getType($numArray[0]));
print("\n");
array_walk($numArray, 'intval');
print(getType($numArray[1]));
print("\n");
var_dump($numArray);
print_r($numArray);
Run Code Online (Sandbox Code Playgroud)
我试图转换String数组,
array_walk($numArray, 'intval')
Run Code Online (Sandbox Code Playgroud)
最后两个打印块在转换之前和之后打印数组元素的类型.
两种情况下的输出都是字符串
string
string
Run Code Online (Sandbox Code Playgroud)
我想知道这里发生了什么?可能..
或者两者都可能.
添加完整的输入和输出,
$ php arrays/arrayStringToInteger.php
Enter space separated numbers to be made to an array
1 1 …Run Code Online (Sandbox Code Playgroud) 我在Travis运行PHPUnit时遇到了一些麻烦.
我的travis配置很简单
language: php
php:
- 7.0
- 7.1
script: phpunit
Run Code Online (Sandbox Code Playgroud)
我的phpunit.xml如下,
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php">
<testsuites>
<testsuite name="Basic Test Suite">
<directory suffix=".php">./tests/</directory>
</testsuite>
</testsuites>
</phpunit>
Run Code Online (Sandbox Code Playgroud)
还有我的composer.json
{
"name": "nikhilkuria/nikeandphp",
"description": "A PHP library used to work with Nike+ API",
"type": "library",
"authors": [
{
"name": "nikhilkuria",
"email": "nikhilkuria@gmail.com"
}
],
"require": {
"monolog/monolog": "^1.22"
},
"require-dev": {
"phpunit/phpunit": "5.7.*"
},
"autoload": {
"psr-4": {"NikeAndPhp\\": "src/NikeAndPhp"}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是特拉维斯无法找到我的autoload.php.这是我在travis日志中看到的,
无法打开文件"/home/travis/build/nikhilkuria/nikeandphp/vendor/autoload.php".
整个日志都在这里.
这里似乎缺少什么?